国/都市のデータはどのように保存されていますか (それらは Core Data にもありますか)? ここで詳細の一部が決まりますが、基本的な考え方は、Cocoa バインディングを使用して、各 NSPopUpButton を NSArrayController のコンテンツにリンクすることです。
Cocoa Bindingはそれほど単純ではありませんが、すべてを正しく構成すると、魔法のように機能します。問題は、正しく構成されていないと、何が問題なのかを判断するのが難しいことです。
一般的な設定は次のとおりです。
最初の NSArrayController を Country Data のコンテンツになるように構成します。Country
Core Data を使用する場合は、それに管理オブジェクト コンテキストを渡し、エンティティ用に独自のデータを準備します。それ以外の場合は、そのコンテンツを、リンクされた都市にアクセスするKey-Value Coding 準拠のメソッドを実装するオブジェクトの既存の配列にバインドする必要があります。ここでデータ ソースにコア データを使用すると、作業が楽になります。
次に、2 番目の NSArrayController をバインドしてselection
、最初の NSArrayController からコンテンツを取得し、都市への適切なキー パスを指定します。Core Data では、これはContent Set
(順序付けされていないため) になります。
編集:ああ、コメント フィールドはまったく価値がありません。最初のコメントに対する適切な応答は次のとおりです。
Core Data でこの関係をモデル化するには、モデルを次のように設定する必要があります。

MBCountry
エンティティにカスタム クラス (および)を指定したことに注意することが重要MBCity
です。クラスを生成するよう Xcode に依頼すると (エンティティを選択し、[新しいファイル...] に移動し、[Cocoa クラス] -> [管理対象オブジェクト クラス] を選択します)、実際のアクセサ メソッドを (単なる ではなくvalueForKey:
) 使用できます。(余談ですが、保存のたびに自動的にこれを行うRentzschのMogeneratorを本当に高く評価しています。)
モデルが設定されたので、次のようにデータ ストアに入力できます。
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 は、ここではやり過ぎです。ただし、プログラムの他のセクションで Core Data を使用したいと思われるので、これは素晴らしい学習の機会になります。学習曲線は非常に急ですが (確かに Cocoa API の最もトリッキーな側面の 1 つです)、実行可能です。プラグを差し込んでください!