给定模型对象,如何在 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 到 NSTreeNode
s,因为它看起来更有效的查找。有什么理由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 中找到索引路径?的主要内容,如果未能解决你的问题,请参考以下文章