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

Cocoa NSTableView如何通过代码设置内容模式(基于视图或基于单元格)?,cocoa,Cocoa,作为标题。 NSTableView如何通过代码设置内容模式(基于视图或基于单元格) 感谢您的帮助NSTableView默认为基于单元格的,这对于向后兼容性很有意义。当表视图委托实现-tableView:viewForTableColumn:row:时,表视图是基于视图的。您可以通过以下方式通过编程方式创建表视图轻松进行测试: @implementation BAVAppDelegate - (void)applicationDidFinishLaunching:(NSNotification

作为标题。 NSTableView如何通过代码设置内容模式(基于视图或基于单元格)


感谢您的帮助

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
如果在注释掉委托方法的情况下运行此代码,则会得到一个基于单元格的表视图:

如果取消对该委托方法的注释,则会得到一个基于视图的表视图:

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

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


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

我查看了NSTableView、NSTableViewDelegate和NSTableViewDataSource的.h文件,没有看到任何明显的内容。我怀疑NSTableView在代码中的工作方式是,它首先尝试获取一个视图,如果这不起作用,它将执行基于单元格的操作。无论哪种方式,99%的开发人员都会通过Interface Builder中的弹出窗口选择“查看”或“单元格”。您不会找到比这更完整的答案。请不要跳过添加
NSTableColumn
,如上面的
-ApplicationIDFinishLaunching
所示!我好几次错过了答案的这一部分。谢谢你@waggles!这是我遗漏的一点,但假设我有“内容模式”问题。此外,如果您计划随后以编程方式制作
NSTableViewCell
,则无法使用;有关推理和解决方案,请参见。