9

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

感谢您的帮助

4

1 回答 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

如果您在注释掉该委托方法的情况下运行此代码,您将获得一个基于单元格的表格视图:

在此处输入图像描述

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

在此处输入图像描述

的文档-tableView:viewForTableColumn:row:指出

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

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

于 2013-10-07T08:02:54.803 回答