在NSOutlineview中实现大文件系统树时,当用户单击节点的左侧向下箭头三角形图标时,它缺少事件通知。当延迟将大量文件节点加载到目录节点并将其表示到NSOutlineview中时,这一点非常重要。否则,开发人员必须将整个目录加载到其中,这样加载会迫使最终用户等待,这是不可接受的。简而言之,当前版本的NSOutlineview无法实现由该问题引起的延迟加载。如果有人遇到这个问题,或者有其他解决方案可以用Cocoa NSOutlineview实现类似Finder的树视图,任何帮助都将不胜感激。
此外:
NSOutlineview在单击图标时不会发出outlineViewItemWillExpand事件,并且仍然缺乏足够的信息来获取哪个节点将展开,即使发出了该事件,[NSOOutlineView selectedRow]也无法工作,因为尚未选择将展开的节点。
我在NSOutlineViewDataSource
:中的以下调用中加载我的子节点
func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool {
guard let node = item as? Node else { return false }
return node.children.count > 0
}
我的Node
类的children
属性是惰性的,因此必须在此处加载。
此方法仅在大纲视图中可见的节点上调用。通过这种方式,您只能在可见树前面加载一层。如果存在子对象,则会显示公开三角形(展开箭头(。
如果你有一种有效的方法来知道一个节点有多少个子节点,而不需要实际加载它们,那么最好在outlineView(_: isItemExpandable:)
中返回子节点计数,然后在outlineViewItemWillExpand(_:)
中进行实际加载,就像Willeke在评论中建议的那样。