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

ane*_*yzm 5 macos cocoa objective-c

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

让我说我有

classA
classA
    - classA
        - classC
        - classC
    - classB
        - classC
        - classC
classB
   - classC
Run Code Online (Sandbox Code Playgroud)

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

更新 对不起,我必须做出更正.outlineView对象是来自NSTreeController数据源的NSTreeNodes.只有"representObject"才是我的自定义类.

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

ste*_*iva 3

无论如何,我在评论中提到的重要“粘合剂”或多或少直接来自这篇精彩的博客文章:保存 NSOutlineView 的展开状态

我获取了树中的所有类,并使它们成为具有expanded属性的抽象类的子类,因此representedObjectan 中的每个类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];
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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