1

私はCocoaプログラミングに不慣れです(ただし、他のUIフレームワークには比較的経験があります)が、次の状況でどこが間違っているのか正確にはわかりません。

NSOutlineViewDataSourceによってラップされたデータの「ツリー」があります。項目は非常に基本的な読み取り/書き込みです(チェックボックスを考えてください)。ただし、

setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item

と呼ばれる、私が行った変更は、問題の単一のアイテムに影響を与えるだけでなく、他のアイテムに伝播する可能性があります。つまり、1つのアイテムをチェックすると、ツリー内の他のアイテムが選択または選択解除される可能性があります。データモデルレベルでは、これは正常に機能しています。私の問題は、これらの他の変更がUIに表示されるように、アウトラインを強制的に更新することです。

したがって、基本的に、setObjectValueが呼​​び出されると、変更された個々のセルが更新されますが、UIで更新するには、(潜在的に)ツリー全体が必要です。

このようなことを行うためのベストプラクティスのメカニズムは何ですか?NSOutlineViewに、更新をトリガーするためにリッスンする必要のあるイベントがありますか。NSOutlineViewDataSourceは、ビューがリッスンするイベントを発生させる必要がありますか?それとも私の基本的なアプローチは完全に間違っていますか?

(私は実際にMonomacでこれを行っていますが、どのような答えもカカオ一般に当てはまると思います)

4

1 に答える 1

1

Andrew-これを行う最も簡単な方法は、KVOプログラミングを調べることです。監視したい特定のアイテムがKVOに準拠している場合は、「addObserver」を使用してウォッチャーを設定できます。次に、オブザーバークラスにデリゲート関数「observeValueForKeyPath」を実装し、その関数が通知されたときにUIに変更を強制できます。あなたが見ている値への変化の。すべてがKVOに準拠しているわけではないため、変更を監視する対象の性質によって、マイレージは異なります。ただし、カスタムオブジェクトのプロパティを監視している場合は、KVOを使用しても問題ありません。

KVOプログラミングガイドはこちらです:

https://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html

于 2012-03-30T04:24:55.763 に答える