NSOutlineView:仅展开特定类的所有对象

时间:2015-07-09 13:37:20

标签: objective-c macos cocoa

NSOutlineView中扩展特定类的所有对象的最有效方法是什么? (我的大纲视图的数据源是NSTreeController)。

我们说我有

classA
classA
    - classA
        - classC
        - classC
    - classB
        - classC
        - classC
classB
   - classC

我只想扩展classA对象。我是否需要遍历整个三个检查哪个类属于每个对象?

更新 对不起,我得纠正一下。 outlineView对象是来自NSTreeController数据源的NSTreeNodes。而且只有"代表对象"是我的自定义类。

因此具有这些类的结构是正确的,但它们不能直接作为大纲视图的节点访问。

3 个答案:

答案 0 :(得分:3)

对于它的价值,我在评论中提到的重要“胶水”或多或少直接来自这篇伟大的博文:Saving the expand state of a NSOutlineView

我接受了树中的所有类,并使它们成为具有expanded属性的抽象类的子类,因此representedObject中的每个NSTreeNode都有expanded作为财产。

但如果您不关心在数据模型中保留expanded,则可能甚至不需要这样做。

直截了当的做法是迭代行:

    for (NSUInteger row = 0; row < [outlineView numberOfRows]; row++)
    {
        // Expand item if it's an classA
        NSTreeNode* treeNode = [outlineView itemAtRow:row];
        if ([treeNode.representedObject isKindOfClass:[ClassA class]])
            [sender.animator expandItem:treeNode];
    }

...你会注意到for循环从引用的博客文章中借用了很多结构。

所以我猜我的答案是懒惰的,“是的,迭代整棵树。”至少显示的树。

编辑:对于那些对MVC有点过分热心的人,我现在觉得有必要指定上面的代码应该在你用作NSOutlineView控制器的类中,通常会实施<NSOutlineViewDelegate>

答案 1 :(得分:0)

听起来像NSOutlineViewDelegate的工作:

- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
{
    if ([[item representedObject] isMemberOfClass:[ClassA class]]) {
        [outlineView expandItem:item];
    }
}

答案 2 :(得分:-1)

  

我是否需要遍历整个三个检查哪个类属于每个对象?

是的,因为那是你想做的事。

但它并不像在stevesliva的A中那么容易:

一个。您不应该迭代大纲视图的项目。这是一种观点。它与数据无关。例如,如果节点关闭,则后代在行列表中。这是因为它们没有行。

B中。而是迭代树控制器的内容。控制器用于数据访问,因此它是访问数据的正确位置。 -arrangedObjectsNSTreeController)可让您访问内容。