回答

1

這是一種方法。另一種方式是在模型發生變化時發佈通知,讓您的控制器觀察這些通知。

此外,模型通常不會自發地改變。通常情況下,更改是在模型外部響應某個事件而啓動的。控制器通常是這樣做的。所以,該控制器也可能會引發對大綱視圖的更新。 (可能有多個控制器,所以也許發起模式改變只是通知窗口或視圖控制器,這將是負責更新大綱視圖控制器)。

+0

在我的情況下,有可能是模式的基礎上不相關的用戶交互的某些事件改變自身(節點添加或刪除自己的孩子)。我會考慮使用全球通知,謝謝! – DrummerB

0

我問標記爲複製此類似的問題:Recommended Pattern for Observing Changes in Tree Structure [duplicate]

我想避免使用NSTreeController,因爲它意味着當更新發生時您將失去對動畫的控制。

我有一個MVVM設置。我的模型是一個圖形,我的視圖模型是一棵樹。任何樹節點和圖節點之間都有一對一的關係。如上面問題中詳細描述的那樣,樹節點和大綱視圖之間顯然存在多種關係。

所以,我......

視圖模型樹節點需要知道當他們的孩子被更新解決,所以我用相關的圖形節點的志願當孩子添加或刪除捕捉。

對於大綱視圖更新,我決定在視圖控制器上實現的模型視圖委託。當添加或刪除子視圖時,視圖模型中的每個樹節點都可以調用樹根上的委託方法。這對我來說是最清晰的方法,並且易於調試。我不想在幕後發生一連串的事情。

最終大綱視圖更新呼叫氈令人滿意簡單:

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

在我直接綁定到圖模型的節點的細節的表格單元視圖的水平。