2013-02-25 8 views
10

NSArrayControllerのコンテンツを順序付けられた多対多の関係のエンティティにバインドするにはどうすればよいですか?NSArrayControllerとオーダードリレーションをバインドする

私は、コアデータモデルで順序付けられていない多対多の関係を持ち、そのコンテンツセットが親エンティティからその関係にバインドされているNSArrayControllerを持っています。これは正常に動作し、データはNSArrayControllerからアクセスできますが、問題はありません。

私は開発中に、ユーザーがこれらの子オブジェクトを手作業で並べ替えることを許可する方がよいと決めたので、その関係を順序付けしたものに変更しました。私のNSArrayControllerは私のペン先から作成されているときに今、次のエラーが表示される:それは注文した関係ですので、今私が注文したセットを取得しています:

Cannot create NSSet from object Relationship '...' fault on managed object ... of class _NSFaultingMutableOrderedSet 

は今実際に、私は、これはすべて理にかなっていると思います。それをコンテンツ配列にバインドすることも、配列ではなくNSOrderedSetになっているので不適切です。私の質問は:今、この関係のデータをNSArrayControllerにバインドする方法はありますか?

+0

私もこの問題に遭遇しました。これはバグレポートを提出した 'NSArrayController'のバグだと確信しています。 – Vervious

+0

Halの答えに記載されている回避策に基づいて、本当に誰もそれをバインドする「真の」方法はないようです。 IMOはショーストッパー、回避策でなければならないので、私はバグレポートも作成します。 – Khakionion

答えて

8

基本的な問題は、コアデータの順序付け多対多関係がNSOrderedSetを返し、NSOrderedSetがNSSetのサブクラスではないということです。 NSSetを必要とする配列コントローラバインディングは失敗します。

Tom Fewsterには、NSValueTransformerを使用してこの欠点を回避し、NSOrderedSetとNSArrayを即座に変換する方法が記述されています。detailed blog post彼はsample implementation on Githubも提供しています。

+0

ありがとう!私が質問の最後の段落で指摘したように、NSSetの継承(むしろその欠如)は、現状のようにバインディングの問題であることを認識しています。しかし、このバリュー・トランスのアプローチは命の恩人です!私はそれを見てみましょう。 – Khakionion

+3

回避策の問題点は、変更可能なアクセサが使用されないことです。つまり、変更があれば、セット全体の再割り当て/再変換を意味します。 – Vervious

9

私は、この議論に何か新しい進展があったかどうかを探している間に、この議論に出くわしました。出荷アプリケーションでは、私は現在、アレイコントローラのコンテンツアレイを[email protected]にバインドしています。それは自分自身を発見したのか、他の誰かがそれをどこかに示唆しているかどうかは分かりません。

+0

これは明らかに解決策です。 – Altimac

+2

"array"演算子がNSOrderSetの "array"メソッドを呼び出すので、これは解決策ではないでしょうか?これは設計によって不変な "facade"配列オブジェクトを返します(NSOrderSet.hのヘッダファイルdocを参照)。 )。つまり、NSArrayControllerは「バインド」できますが、NSOrderedSetに変更を加えることはできません。これはハーフウェイバインディングにすぎません。読み取り専用ソリューション。 –

+0

本当に本当に本当です。変更可能性が必要な場合、これは失敗します。良いキャッチ;) – Altimac

関連する問題