我有一个NSTableView,其内容使用filterPredicate绑定到arrayController。 tableView是基于视图的,因此其委托设置为具有
的对象- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
方法。我得到奇怪的行为,这可能与我的观察有关,即使控制器的arrangeObjects数为0,也会调用此方法。此外,每次调用该方法时,它要求的行数是总数数组控制器内容中的对象(与arrangeObjects相对)。它认为可能是因为我设置了使用
请求的cellView的objectValuecellView.objectValue = [arrayController arrangedObjects] objectAtIndex:row];
通常是错误的。有什么想法吗?
答案 0 :(得分:1)
objectValueForTableColumn不是必需的。刚刚把头撞到了墙上几分钟,然后带着这条阻力最小的道路回来了:
1)将您的NSOutlineView内容绑定到NSTreeController(arrangeObjects控制器键)
2)将每个NSTableCellView的子视图绑定到封闭的NSTableCellView(objectValue.foo,其中foo是目标字段的关键路径)
3)为大纲视图中的每一列设置标识符(我这样做是为了跟踪启动之间对表列的重新排序)
4)确保每个NSTableCellView的标识符都设置为Automatic(或者与表列相同)**这很重要并且与我混淆**
5)当你调用makeViewWithIdentifier时:确保你传递tableColumn.identifier
这假设每个表列只有一个单元格视图类型。否则,您需要在makeViewWithIdentifier中传递所需单元格视图的正确标识符:。
答案 1 :(得分:0)
好吧,我仍然无法解释为什么视图的行为与原来一样,但我确实设法让事情正确行事,执行以下操作:
按如下方式提供每个tableCellView(其中BILSelectableRoundedTableCellView恰好是NSTableCellView的子类):
(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
NSInteger numberOfObjects = [self.arrayController.arrangedObjects count];
if (numberOfObjects == 0)
return nil;
if (row >= numberOfObjects)
return nil;
BILSelectableRoundedTableCellView *viewForTableColumnRow = [self.myTableView makeViewWithIdentifier:@"DataCell" owner:self];
return viewForTableColumnRow; }
最后,使用实现以下内容的数据源:
(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
NSInteger numberOfObjects = [self.arrayController.arrangedObjects count];
if (numberOfObjects == 0)
return nil;
if (row >= numberOfObjects)
return nil;
return [self.arrayController.arrangedObjects objectAtIndex:row]; }
使用后者似乎与文档相反,但是必须使事情正常工作。有趣的是,使用绑定时不会调用其他数据源方法(numberOfRowsInTableView),尽管在我不使用绑定时会调用它。