Cocoa-Bindingの更新-NSArrayController-ComboBox
-
06-07-2019 - |
質問
アプリケーションでは、非常に単純なバインディングを作成しました。 NSArrayControllerにバインドされたNSMutableArrayがあります。コントローラ自体はComboBoxにバインドされ、NSMutableArrayのすべてのコンテンツを表示します。正常に動作します。
問題は次のとおりです。配列の内容が変更されます。ユーザーがアプリに何らかの調整を加えた場合、NSMuteableArray内のすべてのアイテムを削除し、新しいアイテムと異なるアイテムを入力します。
ただし、NSMutableArrayのバインディング<!> lt;-<!> gt; NSArrayController <!> lt;-<!> gt; NSComboBoxは更新されません。
すべてのオブジェクトを配列から削除しても、ComboBoxには同じアイテムが表示されます。
ここで何が問題なのですか?私のアプローチは間違っていますか、それともバインディング自体にリフレッシュするように指示するだけですか?その方法はわかりませんでした。
解決
おそらく<!> quot;コントローラーの後ろの配列を編集している<!> quot ;、これはKVOメカニズムを破壊します。
あなたは言った:
NSArrayControllerにバインドされたNSMutableArrayがあります。
どのように?アレイはどこにありますか?ドキュメントで、KVC / KVO準拠の-myArray / -setMyArray:アクセサーのセットを介してアクセス可能ですか?
<!> quot; myArray <!> quot;を直接言っているに違いない。 iremから-removeAllObjectsへ?これらのKVC / KVOアクセサーはどのように<!> quot; know <!> quot;配列が変更されましたか?
答えはそうではありません。配列全体を本当に置き換える場合は、ドキュメント(または配列を所有している人)に-setMyArray:をまったく新しい配列に伝える必要があります。これにより、適切なKVO呼び出しがトリガーされます。
...しかし、実際には可変配列は必要ありませんか?配列内の個々のアイテムのみを置き換える場合は、インデックス付きアクセサーを使用します。
(ドキュメント-「To-Manyプロパティのコレクションアクセサーパターン」セクションを参照) http://tinyurl.com/yb2zkr5
他のヒント
これを試してください(ARC / OS X 10.7を使用):
ヘッダーファイルで、arrayInstanceとarrayControllerを定義します
@property (weak) IBOutlet NSArrayController *arrayController;
@property (strong) NSArray *arrayInstance; // for the array instance
その後実装
@synthesize arrayController = _arrayController;
@synthesize arrayInstance = _arrayInstance;
_arrayInstance = ....... // What ever the new array will be
[_arrayController setContent:_arrayInstance];
これにより、arrayControllerがコンテンツを強制的に更新し、正しく表示されます。
別の2行のコードソリューションは次のようになります。
[self willChangeValueForKey:@"arrayInstance"];
_arrayInstance = ....... // What ever the new array will be
[self didChangeValueForKey:@"arrayInstance"];
前者はより明白に見え、後者はKVOに似ていると考えてください。
KVC / KVOコンプライアンスが問題のようです。生成されたアクセサメソッドを使用して、新しい配列を作成し、新しいオブジェクトで参照を更新する必要があります。それ以外の場合は、更新されている配列に関するKVOメッセージを起動して、バインディングに配列の内容が変更されたことを通知できます。
クリスチャン