1

問題

NSPopUpButtonにバインドされたポップアップ ボタン ( ) がありNSArrayControllerます。この配列コントローラーは、それぞれが子オブジェクトのコレクションを持つ親オブジェクトを処理します。NSTableViewポップアップで選択したアイテムのこれらの子を表示する必要があります。さらに、子のリストを操作 (追加/削除) する必要があります。

私は多くの方法でこれを達成しようとしましたが、常に解決策を複雑にする何かに遭遇します. これを実装する最良の方法は何ですか?

データはここで Core Data によって管理されるため、コレクションはNSSets. 親に変換メソッドを追加して、並べ替えられたものを返すことを試みましたがNSArray(バインドするためにNSArrayController)、このアプローチでは KVO が妨げられ、アレイ コントローラーが適切に更新されません。

前もって感謝します。

明確にするために、ここに仮説的な例を示します。

他の場所で維持されている国のリストがあるとしましょう。これらの国のいずれかがポップアップ ボタンで選択されます。各国には一連の都市があります。国を選択すると、テーブル ビューにその都市が表示されます。

4

2 に答える 2

3

デリゲート/データソースのセットアップなしでこれを解決する方法があります。

私の文脈はこれです:

  • CoreData親と子を持つモデルでは、1 つの親が子という名前の関係を介して複数の子を持つことができます。どちらにも属性がありますname
  • 2 つのエンティティはクラスとして利用可能でなければなりません (それぞれに a.mと aがあります.h)。(File-New-File-CoreData-NSManagedObjectSubclass に移動すると、Xcode がそれらを書き込みます。) ParentObject の ChildObjects は、ParentObject.children によってアクセスできるようになりました。
  • 2 NSArrayControllers:ParentArrayControllerChildArrayController.
  • 2 NSTableViews:ParentTableChildTable、それぞれに の列が 1 つずつありますname。( によって制御されている限り、ポップアップまたはテーブルのどちらを使用するかは問題ではありませんNSArrayController。)

実行する手順は次のとおりです。

  • 通常どおり両方の NSArrayController を MangagedObjectContext に接続Entity Nameし、それぞれのエンティティ (親または子) を使用して Mode: に設定します。
  • 通常どおり、両方の TableView (それらの列) を NSArrayController にバインドします。
  • ここで魔法が登場します: ChildArrayControllerControllerContent-ContentSet の下の s binding セクションでParentArrayController、 ControllerKey:selectionおよび ModelKeyPath: を使用して にバインドしますchildren

終わり。ParentTable で ParentObject を選択すると、ChildTable にその子が表示されます。

子を親に追加および削除するには(void)addChildrenObject:(Child *)value;、Xcode がParents.mクラス ファイルに記述したメソッドを使用できます。

于 2012-08-03T16:16:46.713 に答える
0

ドラッグアンドドロップだけでこれを実装する方法が見つかりませんでした。都市のテーブルのデリゲートとデータ ソースを実装する必要がありました (例から)。ウィンドウ コントローラーは、ポップアップ ボタンでの選択の変更が通知され、これにより、テーブル ビュー デリゲート/データ ソースのコンテンツが更新されます。

これは、特殊なケースをより詳細に制御できるため、(バインディングや配列コントローラーを使用するよりも) 問題を実装するのに少し良い方法だと実際に感じています。

于 2011-03-25T21:48:52.880 に答える