【问题标题】:Automatically update NSOutlineView upon model changes without NSTreeController在没有 NSTreeController 的模型更改时自动更新 NSOutlineView
【发布时间】:2012-05-12 11:09:29
【问题描述】:

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

【问题讨论】:

    标签: objective-c cocoa key-value-observing nsoutlineview nstreecontroller


    【解决方案1】:

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

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

    【讨论】:

    • 就我而言,模型可能会根据与用户交互无关的某些事件自行更改(节点添加或删除子节点)。我会考虑使用全局通知,谢谢!
    【解决方案2】:

    我问了一个类似的问题,在这里被标记为重复:Recommended Pattern for Observing Changes in Tree Structure [duplicate]

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

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

    所以,我决定...

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2021-07-16
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多