NSTableView中的自动表列标识符

问题描述 投票:2回答:2

经过一些研究,我能够通过“标识符方式”填充NSTableView的一些日期,就像为每列分配唯一标识符一样。但是,我现在想如果有一种方法来填充NSTableView而不向列提供标识符以及如何?

为了更清楚 - 使用自动表列标识符,这里稍微描述:About the automatic table column identifier和我找到了一种方法如何通过这个表达式枚举或获取列的索引:

//in the objectValueForTableColumn blah blah blah method

int columnIndex = [[aTableColumn identifier] intValue];
return [[myArray objectAtIndex: rowIndex] objectAtIndex: columnIndex];

但是,事实是每列中的columnIndex等于0。 (我在NSTableView中有4个列)

能不能帮我看看如何在不设置标识符的情况下显示数据?非常感谢你!

objective-c cocoa nstableview
2个回答
4
投票

首先,您不应该获取列的索引,因为可以拖动列,因此可以更改其索引。但是你可以这样做:

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{

    if ([tableView tableColumns][0] == tableColumn) {
        return [self.array[row] firstName];
    }
    else if ([tableView tableColumns][1] == tableColumn) {
        return [self.array[row] lastName];
    }
}

另一种方法是检查表头单元格标题。使用此选项,您可以决定要在列中填充的值。类似的东西:(但在这里你需要手动设置列标题)

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{

    NSCell *headerCell = [tableColumn headerCell];

    if ([[headerCell title] isEqualToString:@"First Name"]) {
        return [self.array[row] firstName];
    }
    else if ([[headerCell title] isEqualToString:@"Last Name"]) {
        return [self.array[row] lastName];
    }

    return nil;
}

你也可以选择Cocoa-Binding,这里不需要使用标识符!


编辑:

因为你没有类,所以你正在处理基本的C数组。但是委托返回id所以你需要将它强制转换为某些Obj-C对象。在下面的情况下,我使用NSString。看屏幕截图:


0
投票

但是列标识符不是Integer ...因此你的“intValue”总是会带来0。

列标识符(无论是自动的,还是由用户在以编程方式或使用UI编辑器定义表时提供的)都是NSString。它不仅用于查找NSColumn,还用于在NSUserDefaults中自动保存列属性。

另一个错误的假设 - 列标识符与其索引有关。它不是。可以重新排列列(通过拖动它们或以编程方式),以便它们的索引可以更改。

所以 - 为了使你的代码示例适应列标识符 - 我建议你不要使用二维数组(包含行和列的索引),而是使用NSDictionary作为每列信息,其中key(NSString)将是列标识符,值 - 您需要的单元格的值。

所以:行的索引,列标识符的键,样本行看起来像这样:

//in the objectValueForTableColumn blah blah blah method

NSString columnIdentifier = [aTableColumn identifier];
return [[myArray objectAtIndex: rowIndex] valueForKey: columnIdentifier];
© www.soinside.com 2019 - 2024. All rights reserved.