我第一次使用 NSOutlineView (基于单元格)。我需要返回所选父项的索引。
在上图中,有两个父项。如果我选择颜色2,我想返回1.如果颜色未展开,应用程序将返回1。如果它被扩展,它将返回6.
- (void)outlineViewSelectionDidChange:(NSNotification *)notification {
NSOutlineView *outlineView = [notification object];
id item = [outlineView itemAtRow:[outlineView selectedRow]];
if ([item objectForKey:@"parent"]) {
NSInteger r = [outlineView selectedRow]; // returning 6
}
}
无论是否展开任何父项,如何正确返回所选父项的索引?我的问题似乎与this topic有关。然而,由于我对NSOutlineView不是很熟悉,我不知道如何改进我的代码。
Muchos thankos。
答案 0 :(得分:1)
item
返回的-[NSOutlineView itemAtRow:]
是NSTreeNode
个实例。这些对象是由 Cocoa 创建的 - 我自己从不需要创建一个 - 并且用于将传递给大纲视图的对象从数据源中包装起来。它们有两个非常有用的属性:representedObject
(类型为id
)和indexPath
(类型为NSIndexPath
)。 representedObject
是被包裹的对象(您自己的一个模型对象),而您可以将项目的indexPath
视为在完全确定其确切位置的方式扩展的大纲视图 - 这就是你所追求的。获得item
后,将其投放到NSTreeNode
,然后调用其indexPath
媒体资源。在您在问题中概述的情况下,相关索引路径将仅包含一个数字(1
),但索引路径的长度会根据关联项在数据树中的位置而变化。例如,展开Colors 2
时显示的蓝色将具有[0, 3]
的索引路径
- (void)outlineViewSelectionDidChange:(NSNotification *)notification {
NSOutlineView *outlineView = [notification object];
id item = [outlineView itemAtRow:[outlineView selectedRow]];
NSTreeNode *node = (NSTreeNode *)item;
NSIndexPath *ip = [node indexPath];
}