基于视图的NSTableView/NSOutlineView和isGroupItem

6
我有一个基于视图的NSOutlineView,绑定了NSTreeController。一切似乎都正常工作,直到我在委托中实现了outlineView:isGroupItem:方法,然后组标题突然停止显示。就像这样: enter image description here 我确认如果我将NSOutlineView更改为基于单元格,则组项会正确显示。类似的行为也适用于NSTableView。有人遇到过这个问题吗?
1个回答

12

问题已解决!

结果发现我需要在 NSOutlineView 委托中实现以下方法:

- (NSView *)outlineView:(NSOutlineView *)outlineView 
     viewForTableColumn:(NSTableColumn *)tableColumn
                   item:(id)item {
    if ([self outlineView:outlineView isGroupItem:item]) {
        NSString *vId = [[[outlineView tableColumns] objectAtIndex:0] identifier];
        return [outlineView makeViewWithIdentifier:vId owner:self];
    }
    return [outlineView makeViewWithIdentifier:[tableColumn identifier] owner:self];
}

默认情况下,基于视图的NSOutlineView通过定位与列具有相同标识符的视图为表中的每个单元格生成视图。然而,在组项/组行的情况下,该行没有与其关联的tableColumn,因此视图变成nil并且不显示。

玩转苹果的TableViewPlayground示例项目真的很有帮助!强烈推荐!

补充:在接口构建器中,如果您添加Source List对象而不是Outline View,它将为您添加两个原型视图行。

这使您能够设计不同外观的标题和数据行,并通过其标识符在代码中引用它们。

标题单元格: Interface Builder > Header Cell 数据单元格: Interface Builder > Data Cell

当然,您也可以手动添加任意数量的原型视图行。


为什么官方的 NSOutlineViewDelegate 文档中没有提及 outlineView:viewForTableColumn:item: 方法? - zakdances
如何移除分组表头的分隔线(即在分组表头上下方的线条)? 或者 我们如何自定义分组NSOutlineView的表头? - Amit Khandelwal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接