NSOutlineView - 自动展开所有节点

30

我有一个绑定到 NSTreeControllerNSOutlineView(如果这有区别的话),我想在我的 -awakeFromNib() 中展开每个节点。

同时,我还想编程选择第一个节点的第一个子节点。这些在表格视图中很简单,但大纲视图完全不配合我。

谢谢,

Rich

2个回答

71

我想要在-awakeFromNib()方法中展开所有节点。

从Mac OS X 10.5开始,可以使用[outlineView expandItem:nil expandChildren:YES]方法展开所有节点。

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

我还想在同一时间编程选择第一个节点的第一个子项。

在上面的操作完成后,此时该子项将位于第二行。

大纲视图是表格视图的一种,因此您可以使用NSTableView的一个方法:[outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:1] byExtendingSelection:NO]来选择第一个子项。


为什么传递nil会起作用?我尝试了几乎所有我能想到的对象来发送这个消息... - Rich Catalano
1
正如NSOutlineView文档所解释的那样,将nil作为项目传递给它会告诉它展开所有根项目。 - Peter Hosey
1
还有一点需要注意:编程时不要喝太多的酒,也不要像我今天一样忘记将插座连接到NSOutlineView。;) - Rafael Bugajewski
1
显然,在 reloadData 之后添加该调用并没有起作用。有什么解决方法吗? - adib
1
在应用程序启动时,如果您想要通过编程方式扩展NSOutlineView中的某些项目,则会出现一个问题,即NSTreeController在控制器的awakeFromNib被调用后准备其内容。我在这里找到了一个解决方案:http://simplyhacking.com/expanding-nsoutlineview-nodes-at-application-start.html(您必须观察NSTreeController的“content”键路径,并在数据加载完成后立即展开该项。完成后不要忘记删除观察者。) - Daniel

-1

如果你正在从数据源加载,

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接