当前位置:  开发笔记 > 编程语言 > 正文

outlineView:dataCellForTableColumn:item:有奇怪的副作用

如何解决《outlineView:dataCellForTableColumn:item:有奇怪的副作用》经验,为你挑选了1个好方法。

我有一个大纲视图委托,并覆盖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: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;
}

但是,我真的不明白这里发生了什么.如果有人可以解释,那将是有帮助的.谢谢!



1> Brian Webste..:

NSOutlineView能够使用单个单元格绘制整行,而不是每列的单独单元格.它首先要求在nil表列中传递一个单元格.如果为该调用返回一个单元格,它将使用它来绘制整行,否则它将继续并为每列请求一个单独的单元格.因此,正如您所发现的那样,解决方案是在传递nil表列时返回一个nil单元格,这样就可以正常绘制.

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有