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

Coc*_*ser 9 cocoa

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

谢谢你的帮助

小智 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
Run Code Online (Sandbox Code Playgroud)

如果您使用该委托方法注释掉运行此代码,您将获得基于单元格的表视图:

在此输入图像描述

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

在此输入图像描述

对于文件-tableView:viewForTableColumn:row:规定,

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

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

  • 不要跳过添加上面`-applicationDidFinishLaunching`中的`NSTableColumn`!我几次错过了那部分答案. (3认同)