如何通过代码设置NSTableView的内容模式(基于视图或基于单元格)?

9
作为标题。如何通过代码设置NSTableView的内容模式(基于视图或基于单元格)?
感谢您的帮助。

我查看了NSTableView、NSTableViewDelegate和NSTableViewDataSource的.h文件,但没有发现任何明显的东西。我猜测在代码中NSTableView的工作方式是首先尝试获取视图,如果失败,则使用基于单元格的方式。无论哪种方式,99%的开发人员都会通过Interface Builder中的弹出菜单选择“View”或“Cell”。 - Michael Dautermann
1个回答

11

NSTableView 默认为基于单元格的,这对于向后兼容性是有意义的。当表视图委托实现 -tableView:viewForTableColumn:row: 时,表视图将变为基于视图的。您可以通过编程方式创建表视图来轻松测试,如下所示:

@implementation BAVAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSView *contentView = self.window.contentView;
    NSTableView *tableView = [[NSTableView alloc] initWithFrame:(NSRect){{50, NSMaxY(contentView.frame) - 200}, {400, 200}}];
    tableView.dataSource = self;
    tableView.delegate = self;
    [contentView addSubview:tableView];

    NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"column"];
    column.width = 400;
    [tableView addTableColumn:column];
}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
    return 3;
}

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    return [NSString stringWithFormat:@"%ld", row];
}

//- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
//    NSTextField *textField = [[NSTextField alloc] initWithFrame:(NSRect){.size = {100, 15}}];
//    textField.stringValue = [NSString stringWithFormat:@"%ld", row];
//    return textField;
//}

@end

如果您将该委托方法注释掉并运行此代码,则会得到一个基于单元格的表视图:

enter image description here

如果您取消注释该委托方法,您将获得一个基于视图的表格视图:

enter image description here

-tableView:viewForTableColumn:row: 的文档说明如下:

如果您希望在表视图中使用 NSView 对象而不是 NSCell 对象,则需要使用此方法。单元格和视图不能混合在同一个表视图中。

这暗示了它是确定表视图是基于单元格还是基于视图的条件。


你不会找到比这更完整的答案。 - uchuugaka
3
不要跳过上面 -applicationDidFinishLaunching 中看到的添加 NSTableColumn 的部分!我曾经好几次都错过了这部分答案。 - waggles
1
谢谢@waggles!那就是我缺失的部分,但我以为是“内容模式”问题。 - Giles
此外,如果您计划随后以编程方式创建 NSTableViewCell,则不能使用 NSTableView.makeView(withIdentifier:owner:);请参阅此讨论以了解原因和解决方案。 - Jamie Birch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接