1

コンテンツの自動再配置が設定されている ArrayController にアタッチされたフェッチ述語がいくつかの単純な Cocoa バインディングによって変更されるという問題が発生しています。

私のデータ モデルには 3 つのクラスがあります (これらを A、B、C と呼びます)。これは、class_A のインスタンスが class_B の 1 つ以上のインスタンスを所有し、それぞれが class_C の 1 つ以上のインスタンスを所有する厳密な階層に配置されています。クラス B と C の各インスタンスには、その親への弱い参照があります。例えば:

@interface Class_A
@property (strong) NSArray *collection_of_b;
@property BOOL foo;
@end

@interface Class_B
@property (weak) Class_A class_A;
@property (strong) NSArray *collection_of_c;
@property (weak) SomeOtherClass bar;
@end

@interface Class_C
@property (weak) Class_B class_B;
@property (weak) SomeOtherClass baz;
@end

この階層を大規模なマスター/詳細ビューで表示しています。すべての class_A インスタンスのリストを含む最初のテーブル ビューがあります。選択すると、2 番目のテーブル ビューに class_B インスタンスのリストが表示されます。再度選択すると、3 つ目のテーブル ビューに class_C インスタンスのリストが表示されます。

各リストの下には、class_A、class_B、または class_C (foo、bar、baz など) の選択されたインスタンスのさまざまなプロパティにバインドされた一連のフィールドがあります。これらのフィールドは、厳密に KVO に準拠したアクセサーを使用してクラス メンバーを変更するか、フィールドを選択メンバーに直接バインドします。(たとえば、class_A.foo は、YES と NO のラジオ ボタンのセットにバインドされています。) すべてが完全に機能しているようです。

さて、キッカーです。同じウィンドウの別の部分に、いくつかのプロパティを持つ class_C インスタンスのフィルター処理されたリストを表示しています。フィルター処理されたリストを提示するために、"(class_B.bar == some value) OR (class_B.class_A.foo == YES)" のような条件を指定するフィルター述語を使用しています。フィルタリングは完全に機能します...バインドされたフィールドを介して foo または bar の値を変更するまで、次のメッセージでアプリが即座にクラッシュします。

「<Class_B インスタンス> からキー パス "bar" のオブザーバーを削除できません。おそらく、適切な KVO 通知が送信されずにキー "bar" の値が変更されたためです。Class_B クラスの KVO 準拠を確認してください。」

問題を ArrayController のコンテンツの自動再配置設定に絞り込みました。これをオフにすると、インスタンスのフィルタリングされたプロパティが変更されたときに、テーブルはコンテンツを自動的に調整しませんが、クラッシュもしません。もちろん、再配置を手動でトリガーすることもできますが、それは洗練されていない解決策です。

一部の検索では、2009 年の cocoa-dev スレッドが、Auto Arrange Content のまったく同じ動作をバグとして報告していることが明らかになりました。

https://groups.google.com/forum/?hl=en&fromgroups#!topic/cocoa-dev/SpXF0__B4dE

ただし、それについて何ができるかはわかりません。何かご意見は?

4

1 に答える 1