我有一个基于NSOutlineView
模型的基于视图的dataSource/delegate
,而不是绑定到树控制器(我想控制插入/更新动画)。
我要替换模型中的项目,并希望在大纲视图中更新该特定行而不必调用reloadData()
。
我无法使它正常工作。该项目根本不更新,或者该项目的展开状态不更新。根据{{3}},似乎在NSOutlineView内部进行了一些缓存,但是即使有了这些建议,我也无法使它正常工作。
我所拥有的:
(1)大纲视图表示文件夹结构
(2)首先,有一个单文件:
(3)然后将文件替换为文件夹项目:
// Model update
let oldFileItem = rootItem.children.first!
rootItem.children.remove(at: 0)
rootItem.children.append(Item(title: "Folder", children:[], isExpandable:true))
预期结果:
实际结果(reloadItem):
outlineView.reloadItem(oldFileItem) // I kept a reference
图标和标题重新加载,但请注意,缺少扩展三角形。
我有点理解在这种情况下reloadItem()可能无法工作,因为旧项目不再是数据模型的一部分。奇怪的是,项目的标题和图标会更新,但不会扩展状态。
实际结果(reloadData(forRowIndexes:columnIndexes:):
outlineView.reloadData(forRowIndexes: IndexSet(integer:0), columnIndexes: IndexSet(integer:0))
没有任何效果。这是我所期望的。
实际结果(删除/插入):
outlineView.removeItems(at: IndexSet(integer:0), inParent: rootItem, withAnimation: [])
outlineView.insertItems(at: IndexSet(integer:0), inParent: rootItem, withAnimation: [])
没有任何效果。
文档关于removeItems()
说:“如果不扩展父级,该方法将不执行任何操作。”尽管它的子节点可见,并且isExpanded确实为根节点返回false
。对于作为根节点的直接子级的项,这种特殊行为是否存在?我在这里想念什么?
我的数据模型供参考:
class Item:NSObject {
var title:String
var children:[Item]
var isExpandable:Bool
init(title:String, children:[Item], isExpandable:Bool) {
self.title = title
self.children = children
self.isExpandable = isExpandable
}
}
答案 0 :(得分:0)
供参考:
事实证明,这与我使用API的方式有关。 NSOutlineView.removeItems/insertItems
期望nil
作为根项目的inParent
参数。我正在提交实际的根项目。使用nil
代替根项目可以解决此问题。