1

私はココアのバインディングの世界にかなり慣れていないので、いくつかの問題を抱えています (おそらく/おそらく誤解によるものです)。

クラス Plugin のオブジェクトを含む、プラグインと呼ばれる NSMutableArray を含むシングルトンがあります。プラグイン配列にオブジェクトを追加する loadPlugins というメソッドがあります。これはいつでも呼び出すことができます。Interface Builder にインスタンスとして追加されています。

また、IB には NSObjectController があり、そのコンテンツ アウトレットはシングルトンに接続されています。contentArray が NSObjectController にバインドされている NSArrayController もあります (コントローラー キーは「selection」、モデル キー パスは「plugins」、オブジェクト クラス名は「Plugin」です)。

最後に、Plugin クラスのプロパティのキーを使用して、値が NSArrayController の ArrangeObjects にバインドされている 2 つの列を持つテーブル ビューがあります。

これまでのところ標準です(少なくともチュートリアルからわかる限り)。私の問題は、シングルトンで loadPlugins メソッドが呼び出され、プラグイン配列にオブジェクトが追加されたときに、オブジェクトを表示するためにテーブルが更新されないことです (ペン先がロードされる前に loadPlugins が呼び出されない限り)。tableView で呼び出された -reloadData は何もしません。

参照された配列が更新されたことを NSArrayController に伝える方法はありますか? loadPlugins で使用できる NSArrayController の -add: メソッドがあることは理解していますが、シングルトンをディスプレイの側面から完全に分離したいので、これは望ましくありません。

これは以下に関連しているようです: Refresh Cocoa-Binding - NSArrayController - ComboBox

「コントローラーの背後にある配列を編集する」という行は、おそらく問題を特定しているようですが、シングルトンがコントローラーを認識しないようにすることが可能になることを願っています。

前もって感謝します。

\編集...

TechZen の提案によると、バインディングは次のとおりです。

TableColumn --('arrangedObjects', 'pluginName', Value)--> NSArrayController
NSArrayController --('selection', 'plugins', ContentArray)--> NSObjectController
NSObjectController --(content)--> PluginsManager
4

3 に答える 3

5

(適切な KVO 通知をトリガーすることによって) 動作させるややハックな方法として、以下を入れてみてください。

[self willChangeValueForKey:@"plugins"];
[plugins addObject:somePlugin];
[self didChangeValueForKey:@"plugins"];

それ以外の

[plugins addObject:somePlugin];

理想的には、KVC サポートを完全に実装する必要があります。その後、KVC を使用して、バインディングの更新をトリガーする KVO をトリガーできます。それを行った場合、次を使用できます。

[self insertObject:somePlugin inPluginsAtIndex:0];

KVC 準拠に必要なものについては、http: //developer.apple.com/mac/library/documentation/cocoa/conceptual/KeyValueCoding/Concepts/Compliant.htmlを参照してください。

于 2010-04-19T13:28:58.107 に答える
2

私はこれを理解しました-これはRTFM(およびUnderstand-TFM)の古典的なケースでした。すべては、KVC コンプライアンスを確保することに帰着しました。

「プラグイン」と呼ばれる配列を持つ PluginManager シングルトンでは、次のように実装する必要がありました。

-insertObject:inPluginsAtIndex:
-removeObjectFromPluginsAtIndex:

そして、プラグインを追加/削除したいときにこれらのメソッドを使用します。

助けてくれてありがとう。

于 2010-04-21T10:24:57.890 に答える
0

参照された配列が更新されたことを NSArrayController に伝える方法はありますか?

あなたはする必要はありません。それがキー値監視の目的です。これは、バインディング機能全体の基礎です。バインドされたオブジェクト (この場合はインターフェイス要素) は、監視しているオブジェクトが変更されたことを自動的に監視します (通知を受け取ります)。変更が行われたことを手動で通知する必要はありません。テーブルが更新されない場合は、バインドが間違っています。

テキストの説明からはわかりにくいですが、問題は NSObjectController が「選択」に設定されていることだと思います。これは、別の UI 要素を NSObjectController にバインドし、その要素がコントローラー内のデータ項目を選択する場合にのみ機能します。

次のようなバインディングを書き出すことができます。

Object1--(controller key, key path, class)--> Object2 
Object2--(controller key, key path, class)--> Object3

あなたは問題を発見するかもしれません。あなたがそれを投稿すれば、残りの私たちはそれを理解することができます.

(バインディングと Core Data の関係をテキストで表現するための標準が必要ですが、ごちゃ混ぜになると思います。)

于 2010-04-19T13:16:32.147 に答える