NSOutlineView:所选父项的索引

时间:2015-12-28 12:49:45

标签: objective-c cocoa nsoutlineview

我第一次使用 NSOutlineView (基于单元格)。我需要返回所选父项的索引。

enter image description here

在上图中,有两个父项。如果我选择颜色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。

1 个答案:

答案 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];
}