我有一个绑定到我的 NSTreeController 的 NSOutlineView。NSTreecontroller (myTreeController) 的内容使用以下命令设置数据: [self.myTreeController setContent:self.myArrayOfFiles]; 数组的内容由使用 NSTreeNode 子类 (TKnode) 添加的 NSTreeNode 父对象和子对象组成:
[TKnode treeNodeWithRepresentedObject:myRootObject]
.
这很好用,可以正确显示我的 NSoutlineView。但是当我想遍历 NSOutlineView 的内容时,我需要将其展平并将对象存储在一个数组中。这是我需要一些帮助的地方,因为我拥有的解决方案不是最佳的并且可能容易出错。
我首先使用以下方法返回 NSTreeController 的内容:
- (NSArray *)rootNodes;
{
return [[myTreeController arrangedObjects] childNodes] ;
}
这将返回一个包含树结构的大小为 1 的 NSTreeControllerTreeNode 数组。然后我使用 childNodes 方法访问树结构的第一层。
- (NSArray *)flattenedNodes
{
NSMutableArray *mutableArray = [NSMutableArray array];
for (TKnode *rootnode in [self rootNodes]){
for (TKnode *node in [rootnode childNodes]){
if (![[node representedObject] isLeaf]){
[mutableArray addObjectsFromArray:[self descendants:[node representedObject]]];
}
else {
[mutableArray addObject:[[node representedObject] representedObject]];
}
}
}
DLog(@"My files: %lu",[mutableArray count]);
return [[mutableArray copy] autorelease];
}
使用以下方法递归访问子项的子项:
- (NSArray *)descendants:(TKnode *) node
{
NSMutableArray *descendantsArray = [NSMutableArray array];
for (TKnode *mynode in [node childNodes]) {
[descendantsArray addObject:[mynode representedObject]];
if (!mynode.isLeaf){
[descendantsArray addObjectsFromArray:[self descendants:mynode]];
}
}
return [[descendantsArray copy] autorelease]; // return immutable
}
这有效并返回一个数组,其中包含我的所有对象,而不是 NSTreeNode,而是我感兴趣的对象。但似乎很容易出错,我有时必须在对象上调用两次代表对象才能访问我的对象。这是我应该使用 NSTReeController 和 NSTreeNodes 的方式吗?有没有更好的办法?我首先想使用 NSTreeNode 和 NSTreeController 的原因是为了免费获得一些已经实现的方法,例如排序和排列对象,我习惯于使用 NSTableView。但是我用来访问 NSTreeController 内容的方法似乎不正确?我应该使用arrangedObjects
来获取 NSTReeController 的内容还是应该使用不同的方法?非常感谢任何有关如何正确展平 NSOutlineView 的建议。
谢谢!干杯,特隆德