给定模型对象,如何在 NSTreeController 中找到索引路径?

Posted

技术标签:

【中文标题】给定模型对象,如何在 NSTreeController 中找到索引路径?【英文标题】:Given model object, how to find index path in NSTreeController? 【发布时间】:2012-01-29 00:57:09 【问题描述】:

给定NSTreeController 代表的模型对象,如何在树中找到它们的索引路径并随后选择它们?这似乎是一个非常明显的问题,但我似乎找不到任何参考。有什么想法吗?

【问题讨论】:

【参考方案1】:

没有“简单”的方法,您必须遍历树节点并找到匹配的索引路径,例如:

目标-C:

类别

@implementation NSTreeController (Additions)

- (NSIndexPath*)indexPathOfObject:(id)anObject

    return [self indexPathOfObject:anObject inNodes:[[self arrangedObjects] childNodes]];


- (NSIndexPath*)indexPathOfObject:(id)anObject inNodes:(NSArray*)nodes

    for(NSTreeNode* node in nodes)
    
        if([[node representedObject] isEqual:anObject])
            return [node indexPath];
        if([[node childNodes] count])
        
            NSIndexPath* path = [self indexPathOfObject:anObject inNodes:[node childNodes]];
            if(path)
                return path;
        
    
    return nil; 

@end    

斯威夫特:

扩展

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 的树节点。当然,您需要注意节点的所有修改都会反映在您的数组中。 嗯,我在想一个 NSMutableDictionary 映射模型对象或 objectID 到 NSTreeNodes,因为它看起来更有效的查找。有什么理由NSmutableArray 可能会更好吗? NSMutableDictionary 可以正常工作。我倾向于存储项目的NSIndexPath 而不是树节点,因为我不确定它是否保证NSTreeController 总是返回相同的NSTreeNode 每个对象。 @Tony 那你实现了吗?【参考方案2】:

为什么不使用 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/...

我假设您正在这里寻找文件路径,但您可以调整您的数据源可能代表的任何内容。

【讨论】:

问题是为树中的任何给定对象寻找一个 NSIndexPath,以便您可以通过编程将树控制器的 selectedIndexPath(s) 更改为那个。您假设该对象已被选中。如果是这样,您只需从树控制器中获取 selectionIndexPath!

以上是关于给定模型对象,如何在 NSTreeController 中找到索引路径?的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何显示内联表单集中每个模型对象的表单错误

仅在满足父模型的给定条件时如何获取模型关系

如何在 python 和 django 中使用 Pytz 根据给定的 UTC 偏移量转换数据和时间?

检查列表列是否存在使用SharePoint客户端对象模型?

如何自省 Django 中的属性和模型字段?

如何在opengl中计算给定3D点及其2D屏幕位置的投影/模型视图矩阵