首页 > 解决方案 > 使用 NSOutlineview 实现类似 Finder 的树视图并通过延迟加载来表示其节点

问题描述

在 NSOutlineview 中实现大文件系统树时,当用户单击节点的左侧向下箭头三角形图标时,它缺少事件通知。这在将大量文件节点延迟加载到目录节点并将其表示为 NSOutlineview 时非常重要。否则,开发人员必须将整个目录加载到其中,这样加载将迫使最终用户等待,这是不可接受的。简而言之,当前版本的 NSOutlineview 无法实现由该问题引起的延迟加载。是否有人遇到此问题或有替代解决方案来使用 Cocoa NSOutlineview 实现类似 Finder 的树视图,任何帮助将不胜感激。

此外:

单击图标时 NSOutlineview 不会发出 outlineViewItemWillExpand 事件,即使发出该事件,仍然没有足够的信息来获取将展开的节点,[NSOutlineview selectedRow] 无法工作,因为尚未选择要展开的节点。

标签: cocoatreeviewlazy-loadingfindernsoutlineview

解决方案


我在以下调用中加载我的子节点NSOutlineViewDataSource

func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool {
        guard let node = item as? Node else { return false }
        return node.children.count > 0
    }

我的班级的children财产Node是懒惰的,因此被迫在这里加载。

此方法仅在大纲中可见的节点上调用。这样,您只需在可见树之前加载一层。如果孩子存在,则显示三角形(展开箭头)将可见。

如果您有一种有效的方法来知道节点的子节点数量而不实际加载它们,那么最好只返回子节点计数,outlineView(_: isItemExpandable:)然后outlineViewItemWillExpand(_:)按照 Willeke 在评论中的建议进行实际加载。


推荐阅读