3

私のアプリケーションでは、非常に単純なバインディングを作成しました。NSArrayController にバインドされた NSMutableArray があります。コントローラー自体は ComboBox にバインドされ、NSMutableArray のすべてのコンテンツを表示します。正常に動作します。

問題は次のとおりです。配列の内容が変更されます。ユーザーがアプリに何らかの調整を加えた場合、NSMuteableArray 内のすべてのアイテムを削除し、新しい別のアイテムで埋めます。

ただし、NSMutableArray <-> NSArrayController <-> NSComboBox のバインドは更新されません。

Array からすべてのオブジェクトを削除しても、ComboBox には同じアイテムが表示されます。

ここで何が問題なのですか?私のアプローチは間違っていますか、それともバインディングにそれ自体を更新するように指示するだけでよいですか? その方法がわかりませんでした。

4

3 に答える 3

6

KVOメカニズムを覆す「コントローラーの後ろの配列を編集している」可能性があります。

あなたが言った:

NSArrayController にバインドされた NSMutableArray があります。

どのように?アレイはどこに住んでいますか? ドキュメントでは、KVC/KVO 準拠の -myArray / -setMyArray: アクセサーのセットを介してアクセスできますか?

「myArray」ivar に -removeAllObjects を直接指示しているのではないでしょうか。これらの KVC/KVO アクセサーは、配列が変更されたことをどのように「認識」しますか?

答えは、そうではありません。配列全体を実際に置き換える場合は、ドキュメント (または配列の所有者) に -setMyArray: をまったく新しい配列にするように指示する必要があります。これにより、適切な KVO 呼び出しがトリガーされます。

...しかし、可変配列は本当に必要ありませんよね?配列内の個々の項目のみを置き換えたい場合は、インデックス付きアクセサーを使用する必要があります。

(ドキュメンテーション - To-Many Properties セクションの Collection Accessor Patterns を参照してください) http://tinyurl.com/yb2zkr5

于 2009-11-03T16:12:46.700 に答える
1

これを試してください(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"];

最初のほうがより明白で、2 番目の方が KVO に似ていると思います。

于 2012-05-22T12:14:35.273 に答える
0

KVC/KVO 準拠が問題のようです。生成されたアクセサー メソッドを使用して、新しい配列を作成し、新しいオブジェクトで参照を更新する必要があります。それ以外の場合は、配列の内容が変更されたことをバインドに通知するために、配列が更​​新されていることに関する KVO メッセージを発行することができます。

キリスト教徒

于 2009-11-05T16:33:03.787 に答える