【问题标题】:NSOutlineView: Index of Selected Parent ItemNSOutlineView:所选父项的索引
【发布时间】:2015-12-28 12:49:44
【问题描述】:

我第一次使用 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 不是很熟悉,所以我不知道我可以做些什么来改进我的代码。

非常感谢。

【问题讨论】:

  • @AnoopVaidya 恐怕我无法满足您的要求。不过,谢谢您的关心。
  • 没关系...这只是我想的一个示例项目。

标签: objective-c cocoa nsoutlineview


【解决方案1】:

-[NSOutlineView itemAtRow:] 返回的item 是一个NSTreeNode 实例。这些对象是由 Cocoa 创建的——我从来不需要自己创建一个——用于包装从数据源传递到大纲视图的对象。它们有两个非常有用的属性:representedObjectid 类型)和indexPathNSIndexPath 类型)。 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];
}

【讨论】:

  • 应用程序在我有 NSIndexPath *ip = [node indexPath]; 的那一行崩溃
  • 当您记录item 变量和node 变量时会得到什么输出?
  • 它们都返回 2 键字典对象。
  • 它们都返回 2 键字典对象 - 请重现这些日志消息的确切内容 - 什么 是键,什么 是值吗?
  • 注意:如果大纲视图绑定到NSTreeController,则item 属于NSTreeNode 类,否则该项目是从outlineView:child:ofItem: 返回的项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多