解决此问题的一种方法是仅对它起作用的前两列使用绑定。对于剩余的列,您实现一个 NSTableViewDataSource 来实现所需的自定义逻辑。
首先创建一个实现的新类
-tableView:objectValueForTableColumn:row:
-tableView:setObjectValue:forTableColumn:row:
(如果用户应该编辑其他列,则只需要第二个)。然后添加一个
IBOutlet NSArrayController *valuesController;
该类的实例变量。
在 Interface Builder 中添加该类的新对象(将蓝色“对象”立方体从库中拖到文件窗口中)。将阵列控制器连接到新数据源。然后将数据源与表视图连接起来,使其成为表视图的数据源。
确保前两列之后的列未绑定任何内容。
这
-tableView:objectValueForTableColumn:row:
方法将根据需要为这些列调用,您可以根据需要查看对象:
- (id)tableView:(NSTableView *)aTableView
objectValueForTableColumn:(NSTableColumn *)aTableColumn
row:(NSInteger)rowIndex;
{
NSObject *myObject = [[valuesController arrangedObjects] objectAtIndex:rowIndex];
id columnIdentifier = [aTableColumn identifier];
if ([columnIdentifier isEqual:@"foo"]) {
if ([myObject respondsToSelector:@selector(fooValue)]) {
return [myObject fooValue];
}
}
return nil;
}
请注意我如何使用列标识符来查看正在请求的列。在 Interface Builder 中设置列标识符。