【问题标题】:NSOutlineView - Auto-expand all nodesNSOutlineView - 自动展开所有节点
【发布时间】:2010-10-05 21:45:38
【问题描述】:

我有一个NSOutlineView 绑定到一个NSTreeController(如果有区别的话),我想扩展我的-awakeFromNib() 中的每个节点。

我还想同时以编程方式选择第一个节点的第一个子节点。这些事情对于表格视图来说很简单,但大纲根本不适合我。

谢谢,

丰富

【问题讨论】:

    标签: cocoa nsoutlineview


    【解决方案1】:

    我想扩展我的 -awakeFromNib() 中的每个节点。

    从 Mac OS X 10.5 开始,[outlineView expandItem:nil expandChildren:YES]

    在以前版本的 Mac OS X 中,您需要从 0 迭代到行数,使用 [outlineView itemAtRow:row] 获取每一行的项目,并将这些项目存储到数组中,然后迭代数组并传递每个项目到expandItem:expandChildren: 方法。 (您不能混合这两个循环,因为展开一个项目及其所有后代将更改其后续兄弟的行索引;因此,您必须先收集所有顶级项目,然后在拥有所有项目后展开它们。 )

    我还想同时以编程方式选择第一个节点的第一个子节点。

    紧接在上面,它将是第 1 行。

    大纲视图是一种表格视图,因此您将使用 NSTableView 的方法之一:[outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:1] byExtendingSelection:NO]

    【讨论】:

    • 完美,谢谢。为什么传递 nil 有效?我几乎用我能想到的每一个对象都尝试了这个信息……
    • 正如 NSOutlineView 文档解释的那样,将它 nil 作为项目告诉它展开所有根项目。
    • 还有相关的:编码时不要喝太多酒,也不要忘记像我今天一样将插座连接到 NSOutlineView。 ;)
    • 显然在 reloadData 之后添加该调用不起作用。有什么解决方法吗?
    • 当您想在应用程序启动时以编程方式扩展 NSOutlineView 中的某些项目时,一个问题是 NSTreeController 在控制器上调用 awakeFromNib 后准备其内容。我在这里找到了一个解决方案:simplyhacking.com/…(您必须观察 NSTreeController 的“内容”键路径,并在加载数据后立即展开项目。不要忘记删除观察者)完成。)
    【解决方案2】:

    如果您从数据源加载,

    dispatch_async(dispatch_get_main_queue(), ^{
      [self.outlineView expandItem:root expandChildren:YES];
    });
    

    【讨论】:

      猜你喜欢
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 2016-11-18
      相关资源
      最近更新 更多