Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 给定模型对象,如何在NSTreeController中查找索引路径?_Cocoa_Nsindexpath_Nstreecontroller - Fatal编程技术网

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);