NSPopupButton、別の NSPopupButton に応じて更新
-
20-09-2019 - |
質問
2つのNSPopupButtonを使用して都市/国のセレクターを作成したいと考えています。1 つのポップアップ ボタンには最初の部分が含まれます。英国、2 番目のものには 2 番目の部分が含まれます。ロンドンなので、都市/国のコンボ全体が読みます:英国ロンドンしかし、最初の部分が選択されたときに2番目の部分を更新したいのですが、例:ロンドンが選択された場合、2 番目のポップアップボタンで可能な選択肢はロンドン、バーミンガム、マンチェスターなどになります。一方、イタリアが選択された場合、2 番目のポップアップボタンにはベニス、ミラノなどの国が表示されます。
その後、このデータを Core Data の 1 つの属性に保存したいと思います。したがって、この 2 つを結合し、「UK London」を「place」という属性に保存します。
誰かがこれを実装する方法について助けてくれませんか?
ありがとう!
解決
国/都市のデータはどのように保存されていますか (それらも Core Data にありますか)?これによって詳細の一部が決まりますが、基本的な考え方は、Cocoa バインディングを使用して各 NSPopUpButton を NSArrayController のコンテンツにリンクするということです。
ココアバインディング それほど単純ではありませんが、すべてを正しく設定すると、本当に魔法のように機能します。問題は、正しく構成されていない場合、何が問題なのかを判断するのが難しいことです。
一般的な設定は次のとおりです。
最初の NSArrayController を国データのコンテンツとして構成します。Core Data を使用する場合は、それに管理オブジェクト コンテキストを渡し、独自のデータを準備させます。 Country
実在物。それ以外の場合は、そのコンテンツを、 Key-Valueコーディング準拠 リンクされている都市にアクセスする方法。ここでデータ ソースとしてコア データを使用すると、作業が容易になります。
次に、2 番目の NSArrayController をバインドして、そのコンテンツを selection
最初のものには、都市への適切なキー パスが含まれています。Core Data の場合、これは次のようになります。 Content Set
(注文されていないため)。
編集: ああ、コメント欄はまったく価値がありません。最初のコメントに対する適切な返答は次のとおりです。
Core Data でこの関係をモデル化するには、次のようにモデルを設定します。
エンティティにカスタム クラスを与えたことに注意することが重要です (MBCountry
そして MBCity
)。Xcode にクラスの生成を依頼することで (エンティティを選択し、[新しいファイル...] に移動し、[Cocoa クラス] -> [管理対象オブジェクト クラス] を選択します)、実際のアクセサー メソッドを (単なるアクセサー メソッドの代わりに) 使用できます。 valueForKey:
)。(余談ですが、私はとても大切にしています レンチェのモージェネレーター これは保存するたびに自動的に行われます。)
モデルが設定されたので、次のようにデータ ストアにデータを設定できます。
NSArray *countryList = ...; /* Get your array of country names */
for (NSString *countryName in countryList) {
MBCountry *aCountry = (MBCountry *)[NSEntityDescription insertNewObjectForEntityForName:@"MBCountry" inManagedObjectContext:context];
[aCountry setName:countryName];
NSArray *cityList = ... /* Get your array of city names for this country */
for (NSString *cityName in cityList) {
MBCity *aCity = (MBCity *)[NSEntityDescription insertNewObjectForEntityForName:@"MBCity" inManagedObjectContext:context];
[aCity setName:cityName];
[aCountry addCitiesObject:aCity];
}
}
コアデータは本当に 方法 ここでやりすぎ。ただし、プログラムの他のセクションで Core Data を使用したいようです。そのため、これは素晴らしい学習の機会になります。これは非常に急な学習曲線を必要とします (確かに、Cocoa API の最も注意が必要な側面の 1 つです) が、実行可能です。そのままプラグを差し込んでください。