【发布时间】:2021-02-24 20:36:03
【问题描述】:
我在NSScrollView 中嵌入了一个NSTableView,如example 所示,但由于某种原因,设置列宽只有在初始设置时才能正常工作。稍后更改它,即响应按钮单击,根本不会做任何事情。我是这样做的:
[col setMinWidth:1000];
[col setMaxWidth:1000];
[col setWidth:1000];
在这些调用 col.width 正确返回 1000 之后,NSTableView 没有显示更改。它看起来仍然像以前一样,即即使现在列宽为 1000 磅,较长的条目仍会使用 ... 截断。
我在更改列宽后尝试调用[tableView setNeedsDisplay:YES],但没有帮助。在NSScrollView 上调用setNeedsDisplay 也无济于事。我也试过玩NSTableColumn的resizingMask和NSTableView的columnAutoresizingStyle,但都无济于事。尝试更改列宽在这里不起作用。有什么想法吗?
编辑
下面是代码供参考:
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];
列表委托如下所示:
@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
而当按钮被按下时,会执行以下代码:
NSTableColumn *col = [[tableview tableColumns] objectAtIndex:0];
[col setMinWidth:1000];
[col setMaxWidth:1000];
[col setWidth:1000];
【问题讨论】:
标签: objective-c macos cocoa nstableview