2009-02-01 49 views
1

我有一个大纲视图委托,我重写outlineView:dataCellForTableColumn:项目:使我的大纲视图中的单元格按钮(见this question)。这里是我的代表的代码形式:outlineView:dataCellForTableColumn:item:有奇怪的副作用

- (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:项目:方法。我在这里错过了什么?

编辑:

修改这样的委托功能似乎来解决这个问题:

- (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; 
} 

不过,我真的不明白是怎么回事。如果任何人都可以解释,那会很有帮助。谢谢!

回答

5

NSOutlineView有能力让您使用单个单元格绘制整行,而不是每个列的单独单元格。它首先要求一个单元格通过一个零表列。如果您为该调用返回一个单元格,则会使用该单元格绘制整行,否则将继续并为每列请求单独的单元格。所以,正如你发现的,解决方案是在传递一个零表列时返回一个零单元格,所以事情会正常绘制。