首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法更改NSTableColumn的列宽

无法更改NSTableColumn的列宽
EN

Stack Overflow用户
提问于 2020-11-12 19:42:55
回答 2查看 141关注 0票数 0

我在NSTableView中嵌入了一个NSScrollView,如这个example中所示,但是由于某种原因,只有在最初设置它时,才能正确地设置列宽。稍后更改它,即响应按钮单击,根本不会做任何事情。我这样做:

代码语言:javascript
复制
[col setMinWidth:1000];
[col setMaxWidth:1000];
[col setWidth:1000];

在这些调用之后,col.width正确地返回了1000,但是NSTableView没有显示更改。它仍然看起来像以前,即更长的条目仍然被切断使用...,即使列宽度现在是1000个点。

在更改列宽后,我尝试调用[tableView setNeedsDisplay:YES],但这没有帮助。在setNeedsDisplay上调用NSScrollView也于事无补。我也试过玩NSTableColumnresizingMaskNSTableViewcolumnAutoresizingStyle,但是都没有用。试图改变列宽在这里是行不通的。有什么想法吗?

编辑

以下是供参考的代码:

代码语言:javascript
复制
listDelegate = [[MyListDelegate alloc] initWithChoices:array];

scrollview = [[NSScrollView alloc] initWithFrame:NSMakeRect(20, 52, rect.size.width - 2 * 20, 200)];
tableview = [[NSTableView alloc] initWithFrame:NSMakeRect(0, 0, rect.size.width - 2 * 20 - 16, 200)];
column = [[NSTableColumn alloc] initWithIdentifier:@"Column"];

[column setWidth:400];
[tableview addTableColumn:column];
[tableview setHeaderView:nil];
[tableview setDelegate:listDelegate];
[tableview setDataSource:listDelegate];
[tableview reloadData];
[scrollview setDocumentView:tableview];
[scrollview setHasVerticalScroller:YES];
[scrollview setHasHorizontalScroller:YES];  
[[win contentView] addSubview:scrollview];
[scrollview release];
[column release];

列表委托如下所示:

代码语言:javascript
复制
@interface MyListDelegate : NSObject
{
    NSArray *choices;
}
    
- (id)initWithChoices:(NSArray *)c; 
@end

@implementation MyListDelegate

- (id)initWithChoices:(NSArray *)c
{
    if(!(self = [super init])) return nil;

    choices = c;
    
    return self;
}

- (int)numberOfRowsInTableView:(NSTableView *)_tableView
{
    return (int) [choices count];
}

- (id)tableView:(NSTableView *)_tableView objectValueForTableColumn:(NSTableColumn *) tableColumn row:(int)row
{
    return [choices objectAtIndex:row];
}

- (BOOL)tableView:(NSTableView *)_tableView shouldEditTableColumn:(NSTableColumn *) tableColumn row:(int)row
{
    return NO;
}   
@end

当按下按钮时,将执行以下代码:

代码语言:javascript
复制
NSTableColumn *col = [[tableview tableColumns] objectAtIndex:0];
[col setMinWidth:1000];
[col setMaxWidth:1000];
[col setWidth:1000];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-13 10:47:22

在我看来就像个虫子。[col setMinWidth:1000]还将宽度设置为1000,但不更新表视图。[col setWidth:1000]什么也不做,因为宽度是1000。Fix:先设置宽度:

代码语言:javascript
复制
[col setWidth:1000];
[col setMinWidth:1000];
[col setMaxWidth:1000];
票数 1
EN

Stack Overflow用户

发布于 2020-11-12 21:23:58

下面是一种更改表视图的列宽度的技术。

代码语言:javascript
复制
#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate, NSTableViewDelegate, NSTableViewDataSource> {
 NSWindow *window;
 NSTableColumn *column1;
}
- (void) myBtnAction;
- (void) buildMenu;
- (void) buildWindow;
@end

@implementation AppDelegate

- (void) myBtnAction {
 [column1 setWidth:150];
}

- (void) buildMenu {
 NSMenu *menubar = [NSMenu new];
 NSMenuItem *menuBarItem = [NSMenuItem new];
 [menubar addItem:menuBarItem];
 [NSApp setMainMenu:menubar];
 NSMenu *appMenu = [NSMenu new];
 NSMenuItem *quitMenuItem = [[NSMenuItem alloc] initWithTitle:@"Quit" action:@selector(terminate:) keyEquivalent:@"q"];
 [appMenu addItem:quitMenuItem];
 [menuBarItem setSubmenu:appMenu];
}

- (void) buildWindow {

#define _wndW  500
#define _wndH  350

window = [[NSWindow alloc] initWithContentRect: NSMakeRect( 0, 0, _wndW, _wndH )
styleMask: NSWindowStyleMaskTitled | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable
backing: NSBackingStoreBuffered defer: NO];

[window center];
[window setTitle: @"Test window"];
[window makeKeyAndOrderFront: nil];

// **** TableView_SO **** //
 NSScrollView *scrlView = [[NSScrollView alloc] initWithFrame:NSMakeRect(60, 100, 380, 200)];
 NSTableView *tableView = [[NSTableView alloc] initWithFrame:NSMakeRect(0, 0, 364, 200)];
// create columns for our table
 column1 = [[NSTableColumn alloc] initWithIdentifier:@"Col1"];
 NSTableColumn * column2 = [[NSTableColumn alloc] initWithIdentifier:@"Col2"];
 [column1 setWidth:252];
 [column2 setWidth:198];
// generally you want to add at least one column to the table view.
 [tableView addTableColumn:column1];
 [tableView addTableColumn:column2];
 [tableView setDelegate:self];
 [tableView setDataSource:self];
 [tableView reloadData];
// embed table view in the scroll view, and add the scroll view to window.
 [scrlView setDocumentView:tableView];
 [scrlView setHasVerticalScroller:YES];
 [[window contentView] addSubview:scrlView];

// **** Button **** //
NSButton *myBtn =[[NSButton alloc]initWithFrame:NSMakeRect( 30, 30, 135, 30 )];
[myBtn setBezelStyle:NSBezelStyleRounded ];
[myBtn setTitle: @"Change Col1 Width"];
[myBtn setAction: @selector (myBtnAction)];
[[window contentView] addSubview: myBtn];

// **** Quit btn **** //
NSButton *quitBtn = [[NSButton alloc]initWithFrame:NSMakeRect( _wndW - 50, 5, 40, 40 )];
[quitBtn setBezelStyle:NSBezelStyleCircular ];
[quitBtn setTitle: @"Q" ];
[quitBtn setAutoresizingMask: NSViewMinXMargin];
[quitBtn setAction:@selector(terminate:)];
[[window contentView] addSubview: quitBtn];
}

- (void) applicationWillFinishLaunching: (NSNotification *)notification {
[self buildMenu];
[self buildWindow];
}

- (void) applicationDidFinishLaunching: (NSNotification *)notification {

}
@end

int main (){
 NSApplication *application = [NSApplication sharedApplication];
 AppDelegate *appDelegate = [[AppDelegate alloc] init];
 [application setDelegate:appDelegate];
 [application run];
return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64810697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档