1

BikeRiderという関係プロパティを持つエンティティがあると仮定しましょうhelmets

アプリのマネージド オブジェクト コンテキストにバインドされた配列コントローラーがあり、エンティティが に設定されていBikeRiderます。すべての自転車ライダーを一覧表示するテーブルビューがあります。

次に、アプリのマネージド オブジェクト コンテキストにバインドされた 2 つ目の配列コントローラーを用意し、エンティティを に設定しHelmetます。さらに、 にバインドされていbikeRiderArrayController.selectionます。選択したバイク ライダーのすべてのヘルメットを一覧表示する 2 つ目のテーブルビューがあります。

ヘルメットを追加および削除するための 2 つのボタンもあります。セットアップは明らかに問題なく動作します。

もちろん、小さなことを除いて: 、 、 のように見え、-addHelmetsObject:決して呼び出さ-removeHelmetsObject:れません。これは、各ヘルメットのプロパティの監視を設定するためのコードが呼び出されないことを意味します。-addHelmets:-removeHelmets:color

私は何が欠けていますか?addHelmets:et al を (適切なwillChangeValueForKey:et al 通知を使用して)オーバーライドすることは、追加の通知を受け取る正しい方法ではありませんか?

[self observeValueForKey:@"helmets". . .]どのオブジェクトが追加または削除されたかを把握するために、本当に必要な[oldValue minusSet:newValue]のか、またその逆なのか? メソッドは過去に正しく呼び出されていたと断言できます。セットアップのいくつかの重要な要素が今とは異なっているのかもしれません。

4

1 に答える 1

1

これは、NSArrayController を介して正しく機能したことはありません。Appleのドキュメントから:

カスタム リレーションシップ セット ミューテーター メソッドが arraycontroller によって呼び出されない

問題:「カスタム対多リレーションシップ アクセサー メソッド」で説明されているように、リレーションシップに set mutator メソッドを実装し、NSArrayController インスタンスの contentSet バインディングをリレーションシップにバインドしましたが、オブジェクトを追加するときに set mutator メソッドが呼び出されません。アレイ コントローラからオブジェクトを削除します。

原因:これはバグです。

対処法: contentSet バインディングのキー パスに self を追加することで、これを回避できます。たとえば、[Department Object Controller].selection.employees にバインドする代わりに、[Department Object Controller].selection.self.employees にバインドします。

于 2013-04-09T01:22:10.063 に答える