0

如果我将 NSOutlineView 从使用绑定和 NSTreeController 更改为拥有数据源和委托,如果我的模型树发生更改,我将如何自动更新 NSOutlineView?我是否应该使用控制器观察树中每个节点的 childNodes 属性并在发生更改时触发重新加载?还是有其他方法?

4

2 回答 2

1

这是一种方式。另一种方法是模型在更改时发布通知并让您的控制器观察这些通知。

此外,模型通常不会自发改变。通常,更改是在模型外部启动以响应某些事件。控制器通常会这样做。因此,该控制器还可以引发对大纲视图的更新。(可能有多个控制器,因此启动模型更改的控制器可能只是通知窗口或视图控制器,它们将负责更新大纲视图。)

于 2012-05-12T12:18:31.417 回答
0

我问了一个类似的问题,在这里被标记为重复:推荐的观察树结构变化的模式 [重复]

我想避免使用 NSTreeController,因为这意味着当更新发生时你会失去对动画的控制。

我有一个 MVVM 设置。我的模型是图,我的视图模型是树。任何树节点与图节点之间存在一对一的关系。正如上面问题中所详述的,树节点和大纲视图之间显然存在多对一的关系。

所以,我和...

视图模型树节点需要知道它们的子节点何时更新,因此我使用关联图节点的 KVO 来捕获添加或删除子节点的时间。

对于大纲视图更新,我选择了在视图控制器上实现的模型视图委托。当添加或删除子节点时,视图模型中的每个树节点都可以调用树根上的委托方法。这对我来说是最清晰的方法,并且易于调试。我不希望幕后发生一连串的事情。

最终的大纲视图更新调用感觉非常简单:

func itemsInserted(atIndexes indexes: IndexSet, forParent parent: ECViewModelNode) {
        outlineView?.insertItems(at: indexes, inParent: parent, withAnimation: .slideDown)
    }

在表格单元视图级别,我直接绑定到图模型节点的详细信息。

于 2018-01-19T16:18:42.887 回答