objective-c - NSOutlineView:所选父项的索引

标签 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 不太熟悉,我不知道我可以做些什么来改进我的代码。

非常感谢。

最佳答案

-[NSOutlineView itemAtRow:] 返回的 item 是一个 NSTreeNode 实例。这些对象是由 Cocoa 创建的 - 我从来不需要自己创建一个 - 并用于包装从数据源传递到大纲 View 的对象。它们有两个非常有用的属性:representedObject(类型为id)和indexPath(类型为NSIndexPath)。 representedObject 是被包装的对象(您自己的模型对象之一),而您可以将项目的 indexPath 视为在中建立其确切位置的一种方式。完全展开的轮廓 View - 这就是您所追求的。获得 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];
}

关于objective-c - NSOutlineView:所选父项的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34493854/

相关文章:

cocoa - 会将 subview 带到前面吗?

cocoa - NSOutlineView - 自动展开所有节点

objective-c - 即使应用程序空闲,NSOutlineView 也会不断更新

ios - 点击本地通知 iOS

iphone - Mac 相当于 UIBarButtonSystemItemAction

ios - NSDate 清零时分秒

iphone - NSSetUncaughtExceptionHandler 被第三方 SDK 劫持

objective-c - 具有多行的 NSTextFieldCell

ios - 如何使用 NSPredicate 按日期差异大于 x 天进行过滤

iphone - 您可以根据地址在 Mapview 中创建注释吗?