在NSOutlineView
中扩展特定类的所有对象的最有效方法是什么? (我的大纲视图的数据源是NSTreeController
)。
我们说我有
classA
classA
- classA
- classC
- classC
- classB
- classC
- classC
classB
- classC
我只想扩展classA对象。我是否需要遍历整个三个检查哪个类属于每个对象?
更新 对不起,我得纠正一下。 outlineView对象是来自NSTreeController数据源的NSTreeNodes。而且只有"代表对象"是我的自定义类。
因此具有这些类的结构是正确的,但它们不能直接作为大纲视图的节点访问。
答案 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中。而是迭代树控制器的内容。控制器用于数据访问,因此它是访问数据的正确位置。 -arrangedObjects
(NSTreeController
)可让您访问内容。