我有一个大纲视图委托,并且覆盖了outlineView:dataCellForTableColumn:item:使我的大纲视图中的单元格成为按钮(参见this question)。这是我的代表的代码形式:
- (NSCell *)outlineView:(NSOutlineView *)outlineView dataCellForTableColumn:(NSTableColumn *)tableColumn item:(id)item;
{
MyCell * myCell = [[MyCell alloc] init];
// return nil;
return myCell;
}
这样做有一个奇怪的副作用。在我的大纲视图的数据源中,方法outlineView:objectValueForTableColumn:byItem:始终为tableColumn获取空值。
代码是:
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
{
printf("tableColumn:%s\ttable identifier: %s\n", [[tableColumn className] cString], [[tableColumn identifier] cString]);
return [item valueForKey:[tableColumn identifier]];
}
输出是:
tableColumn:(null) table identifier: (null)
奇怪的是,只有在我实现outlineView:dataCellForTableColumn:item:方法时才会发生这种情况。我在这里缺少什么?
编辑:
像这样修改委托函数似乎可以解决问题:
- (NSCell *)outlineView:(NSOutlineView *)outlineView dataCellForTableColumn:(NSTableColumn *)tableColumn item:(id)item;
{
printf("delegate column identifier: %s\n", [[tableColumn identifier] cStringUsingEncoding:NSASCIIStringEncoding]);
if (tableColumn == nil)
{
return nil;
}
MyCell * aCustomCell = [[MyCell alloc] init];
return aCustomCell;
}
但是,我真的不明白这里发生了什么。如果有人可以解释,那将是有帮助的。谢谢!
答案 0 :(得分:5)
NSOutlineView能够使用单个单元格绘制整行,而不是每列的单独单元格。它首先要求在nil表列中传递一个单元格。如果为该调用返回一个单元格,它将使用它来绘制整行,否则它将继续并为每列请求一个单独的单元格。因此,正如您所发现的那样,解决方案是在传递nil表列时返回一个nil单元格,这样就可以正常绘制。