cocoa - 使用 NSOutlineview 实现类似 Finder 的树视图并通过延迟加载来表示其节点
问题描述
在 NSOutlineview 中实现大文件系统树时,当用户单击节点的左侧向下箭头三角形图标时,它缺少事件通知。这在将大量文件节点延迟加载到目录节点并将其表示为 NSOutlineview 时非常重要。否则,开发人员必须将整个目录加载到其中,这样加载将迫使最终用户等待,这是不可接受的。简而言之,当前版本的 NSOutlineview 无法实现由该问题引起的延迟加载。是否有人遇到此问题或有替代解决方案来使用 Cocoa NSOutlineview 实现类似 Finder 的树视图,任何帮助将不胜感激。
此外:
单击图标时 NSOutlineview 不会发出 outlineViewItemWillExpand 事件,即使发出该事件,仍然没有足够的信息来获取将展开的节点,[NSOutlineview selectedRow] 无法工作,因为尚未选择要展开的节点。
解决方案
我在以下调用中加载我的子节点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 在评论中的建议进行实际加载。
推荐阅读
- hibernate - 使用 HQL JOIN 填充 JavaFX TableView 会返回奇怪的数据
- mysql - Sentencia ALTER COLUMN nombre_columna SET no funciona en MySQL
- java - JAVA:将框架和对话框放在前面
- javascript - 如何在不刷新整个页面的情况下使用 AJAX 刷新 div?
- angular - 如何修复这个 Angular 错误:参数表达式 expected.ts(1135)?
- kotlin - 可见性降低的 Kotlin / Native c 互操作
- javascript - 将 JSON 对象转换为 html 字符串
- php - 是否有另一种更好的方法可以使用 php 在 SQL 中按年过滤?
- bash - /bin/test 以红色打印“目录不在工作区中:/Users/myusr”。这是一个错误吗?
- flutter - 如何在 Flutter 的 Dialog 中配置 FocusNode 和 TextEditingController