0

NSOutlineViewを使用してバインディングとNSTreeControllerをデータソースとデリゲートに変更した場合、モデルツリーが変更されると自動的にNSOutlineViewを更新しますか?ツリー内の各ノードのchildNodesプロパティをコントローラで監視し、変更が発生したときにリロードをトリガする必要がありますか?それとも別の方法がありますか?NSTreeControllerなしのモデル変更時に自動的にNSOutlineViewを更新

答えて

1

これは1つの方法です。もう1つの方法は、モデルが変更を通知したときに通知を送信し、コントローラがそれらの通知を観察するようにすることです。

また、モデルは通常、自発的に変化しません。通常、変更は何らかのイベントに応答してモデル外で開始されます。コントローラーが通常それをやっています。したがって、そのコントローラは、アウトラインビューの更新を引き起こす可能性もあります。 (複数のコントローラがあるかもしれないので、モデルの変更を開始するコントローラは、アウトラインビューの更新を担当するウィンドウまたはビューコントローラに通知するだけかもしれません)。

+0

私のケースでは、ユーザーのやりとりに関係しない特定のイベントに基づいて、モデル自体が変更される可能性があります(ノードが子を追加または削除します)。ありがとうございました! – DrummerB

0

ここでは重複してマークされた:Recommended Pattern for Observing Changes in Tree Structure [duplicate]

NSTreeControllerの使用を避けたかったのは、アップデートが発生したときにアニメーションのコントロールが失われたということです。

MVVMをセットアップしました。私のモデルはグラフで、私のビューモデルはツリーです。ツリーノードとグラフノードの間には1対1の関係があります。上記の質問で詳述したように、ツリーノードとアウトラインビューとの間には、明らかに多くの関係があります。

だから、私は

...と和解ビューモデルツリーのノードは、その子が更新されたときに知っておく必要があり、その子が追加または削除されているとき、私はキャッチする関連するグラフノードのKVOを使用。

概要ビューの更新については、私がビューコントローラに実装しているモデルビューのデリゲートを解決しました。ビューモデル内の各ツリーノードは、子が追加または削除されたときにツリールート上にデリゲートメソッドを呼び出すことができます。これは私にとって最も明確なアプローチであり、容易にデバッグ可能であると感じました。私は物事の連鎖が舞台裏で起こることを望んでいませんでした。

最終アウトラインビュー更新呼び出しが満足のいく簡単フェルト:表セルビューレベルで

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

Iグラフモデルノードの詳細に直接結合します。

関連する問題