经过长时间的努力,我设法找到了问题的解决方案。问题的一部分是数据模型方面的简单错误,但这并不重要,更困难的是使用 NSTableView 委托和数据源来完成。
主要有 3 个困难阻碍了对这个问题的良好理解和管理:
以下是您应该执行的步骤:
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex {
buttonCell = [aTableColumn dataCell];
NSString *columnKey = [aTableColumn identifier];
return buttonCell;
}
您可以看到无论您是否使用它都必须实现此方法。
- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
buttonCell = [tableColumn dataCell];
NSString *columnKey = [tableColumn identifier];
if(tableView == dimensionTable) {
// returnObject = @"Dimension";
// [dimensionButtonCell setTitle:@"Dimension"];
// buttonCell = dimensionButtonCell;
}
else if(tableView == shopTable) {
[buttonCell setState:[[mySelectedShops objectAtIndex:row] integerValue]];
[buttonCell setTitle:[myShops objectAtIndex:row]];
}
else if(tableView == countryTable) {
[buttonCell setState:[[mySelectedCountries objectAtIndex:row] integerValue]];
[buttonCell setTitle:[myCountries objectAtIndex:row]];
}
return buttonCell;
}
你可以看到我使用了第二种方法,但是objectValueForTableColumn
可以单独使用。您还可以看到,我有 NSMutableArray mySelectedShops 和 mySelectedCountries 来为表格视图中的每一行保存 NSInteger(1 或 0)包裹在 NSNumber 中。
如果设置 NSCell 的 state 或 integerValue 没有区别。两者都将选中和取消选中 NSButtonCell 值为 1 或 0 的 NSInteger 类型。
- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex {
NSString *columnKey = [aTableColumn identifier];
if(aTableView == dimensionTable) {
// [dimensionButtonCell setTitle:@"Dimension"];
// buttonCell = dimensionButtonCell;
}
else if(aTableView == shopTable) {
[mySelectedShops replaceObjectAtIndex:rowIndex withObject:[NSNumber numberWithInteger:[(NSCell*)anObject integerValue]]];
}
else if(aTableView == countryTable) {
[mySelectedCountries replaceObjectAtIndex:rowIndex withObject:[NSNumber numberWithInteger:[(NSCell*)anObject integerValue]]];
}
}
虽然我将 NSInteger 值传递给 NSCell 对象,但这里的 anObject 是 __NSCFBoolean 类型,这意味着某些事情无法按预期工作。为了能够将对象值替换为数组,我将其转换为 NSCell 只是为了获取 integerValues。它实际上也可以在没有演员表的情况下工作,所以这对我来说是另一个谜,但我更喜欢这种方式。
很明显,Apple 正在转向 UITableView 等基于视图的单元格。不过,我希望这会对某人有所帮助。