替换项目时,NSOutlineView reloadItem / reloadData不起作用

时间:2019-11-19 10:19:12

标签: cocoa nsoutlineview

我有一个基于NSOutlineView模型的基于视图的dataSource/delegate,而不是绑定到树控制器(我想控制插入/更新动画)。

我要替换模型中的项目,并希望在大纲视图中更新该特定行而不必调用reloadData()

我无法使它正常工作。该项目根本不更新,或者该项目的展开状态不更新。根据{{​​3}},似乎在NSOutlineView内部进行了一些缓存,但是即使有了这些建议,我也无法使它正常工作。

我所拥有的:

(1)大纲视图表示文件夹结构

(2)首先,有一个单文件:

this

(3)然后将文件替换为文件夹项目:

 // Model update
 let oldFileItem = rootItem.children.first!
 rootItem.children.remove(at: 0)
 rootItem.children.append(Item(title: "Folder", children:[], isExpandable:true))

预期结果:

file

实际结果(reloadItem):

outlineView.reloadItem(oldFileItem) // I kept a reference

expected folder

图标和标题重新加载,但请注意,缺少扩展三角形。

我有点理解在这种情况下reloadItem()可能无法工作,因为旧项目不再是数据模型的一部分。奇怪的是,项目的标题和图标会更新,但不会扩展状态。

实际结果(reloadData(forRowIndexes:columnIndexes:):

outlineView.reloadData(forRowIndexes: IndexSet(integer:0), columnIndexes: IndexSet(integer:0))

folder no expansion state

没有任何效果。这是我所期望的。

实际结果(删除/插入):

outlineView.removeItems(at: IndexSet(integer:0), inParent: rootItem, withAnimation: [])
outlineView.insertItems(at: IndexSet(integer:0), inParent: rootItem, withAnimation: [])

file

没有任何效果。

文档关于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
    }
}

1 个答案:

答案 0 :(得分:0)

供参考:

事实证明,这与我使用API​​的方式有关。 NSOutlineView.removeItems/insertItems期望nil作为根项目的inParent参数。我正在提交实际的根项目。使用nil代替根项目可以解决此问题。