Cocoa 给定模型对象,如何在NSTreeController中查找索引路径?
给定Cocoa 给定模型对象,如何在NSTreeController中查找索引路径?,cocoa,nsindexpath,nstreecontroller,Cocoa,Nsindexpath,Nstreecontroller,给定NSTreeController表示的模型对象,如何在树中找到它们的索引路径并随后选择它们?这似乎是一个显而易见的问题,但我似乎找不到任何参考。有什么想法吗?没有“简单”的方法,您必须遍历树节点并找到匹配的索引路径,例如: 目标-C: 类别 Swift: 延伸 为什么不使用NSOutlineView获取如下父项: NSMutableArray *selectedItemArray = [[NSMutableArray alloc] init]; [selectedItemArray add
NSTreeController
表示的模型对象,如何在树中找到它们的索引路径并随后选择它们?这似乎是一个显而易见的问题,但我似乎找不到任何参考。有什么想法吗?没有“简单”的方法,您必须遍历树节点并找到匹配的索引路径,例如:
目标-C:
类别
Swift:
延伸
为什么不使用NSOutlineView获取如下父项:
NSMutableArray *selectedItemArray = [[NSMutableArray alloc] init];
[selectedItemArray addObject:[self.OutlineView itemAtRow:[self.OutlineView selectedRow]]];
while ([self.OutlineView parentForItem:[selectedItemArray lastObject]]) {
[selectedItemArray addObject:[self.OutlineView parentForItem:[selectedItemArray lastObject]]];
}
NSString *selectedPath = @".";
while ([selectedItemArray count] > 0) {
OBJECTtype *singleItem = [selectedItemArray lastObject];
selectedPath = [selectedPath stringByAppendingString:[NSString stringWithFormat:@"/%@", singleItem.name]];
selectedItemArray removeLastObject];
}
NSLog(@"Final Path: %@", selectedPath);
这将输出:./item1/item2/item3/
我假设您正在这里查找文件路径,但您可以根据数据源可能表示的内容进行调整。哎哟,这真是效率低下。我正在考虑编写treecontroller的一个子类,它保持模型和treenodes之间的映射。或者模型上保留对关联树节点引用的类别。您在子类中需要做的就是维护树节点的平面
NSMutableArray
。当然,您需要注意的是,节点的所有修改都会反映在数组中。嗯,我正在考虑使用NSMutableDictionary
将模型对象或objectID映射到NSTreeNode
s,因为它看起来更高效。是否有任何理由认为NSmutableArray
可以更好地工作?NSMutableDictionary
可以。我倾向于存储项的nsindepath
,而不是树节点,因为我不确定NSTreeController
是否保证每个对象总是返回相同的NSTreeNode
。@Tony你实现了吗?问题是为树中的任何给定对象寻找nsindepath,因此,您可以通过编程方式将树控制器的selectedIndexPath更改为该路径。假设对象已被选中。如果是这样,您只需从树控制器获取selectionIndexPath!
extension NSTreeController {
func indexPathOfObject(anObject:NSObject) -> NSIndexPath? {
return self.indexPathOfObject(anObject, nodes: self.arrangedObjects.childNodes)
}
func indexPathOfObject(anObject:NSObject, nodes:[NSTreeNode]!) -> NSIndexPath? {
for node in nodes {
if (anObject == node.representedObject as! NSObject) {
return node.indexPath
}
if (node.childNodes != nil) {
if let path:NSIndexPath = self.indexPathOfObject(anObject, nodes: node.childNodes)
{
return path
}
}
}
return nil
}
}
NSMutableArray *selectedItemArray = [[NSMutableArray alloc] init];
[selectedItemArray addObject:[self.OutlineView itemAtRow:[self.OutlineView selectedRow]]];
while ([self.OutlineView parentForItem:[selectedItemArray lastObject]]) {
[selectedItemArray addObject:[self.OutlineView parentForItem:[selectedItemArray lastObject]]];
}
NSString *selectedPath = @".";
while ([selectedItemArray count] > 0) {
OBJECTtype *singleItem = [selectedItemArray lastObject];
selectedPath = [selectedPath stringByAppendingString:[NSString stringWithFormat:@"/%@", singleItem.name]];
selectedItemArray removeLastObject];
}
NSLog(@"Final Path: %@", selectedPath);