1

2 つの NSPopupButton を使用して都市/国セレクターを作成したいと考えています。1 つのポップアップ ボタンには英国などの最初の部分が含まれ、2 つ目のポップアップ ボタンにはロンドンなどの 2 番目の部分が含まれますしたがって、都市/国のコンボ全体は次のように表示されます: UK London ただし、最初の部分が選択されたときに 2 番目の部分を更新したいたとえば、ロンドンが選択された場合、2 番目のポップアップ ボタンで可能な選択肢はロンドン、バーミンガム、マンチェスターなどになり、イタリアが選択された場合、2 番目のポップアップ ボタンにはベニス、ミラノなどの国が表示されます。

その後、このデータを Core Data の 1 つの属性に格納したいと考えています。この 2 つを結合し、"UK London" を "place" という属性に格納します。

これを実装する方法について誰か助けてもらえますか?

ありがとうございました!

4

1 に答える 1

2

国/都市のデータはどのように保存されていますか (それらは Core Data にもありますか)? ここで詳細の一部が決まりますが、基本的な考え方は、Cocoa バインディングを使用して、各 NSPopUpButton を NSArrayController のコンテンツにリンクすることです。

Cocoa Bindingはそれほど単純ではありませんが、すべてを正しく構成すると、魔法のように機能します。問題は、正しく構成されていないと、何が問題なのかを判断するのが難しいことです。

一般的な設定は次のとおりです。

最初の NSArrayController を Country Data のコンテンツになるように構成します。CountryCore Data を使用する場合は、それに管理オブジェクト コンテキストを渡し、エンティティ用に独自のデータを準備します。それ以外の場合は、そのコンテンツを、リンクされた都市にアクセスするKey-Value Coding 準拠のメソッドを実装するオブジェクトの既存の配列にバインドする必要があります。ここでデータ ソースにコア データを使用すると、作業が楽になります。

次に、2 番目の NSArrayController をバインドしてselection、最初の NSArrayController からコンテンツを取得し、都市への適切なキー パスを指定します。Core Data では、これはContent Set(順序付けされていないため) になります。


編集:ああ、コメント フィールドはまったく価値がありません。最初のコメントに対する適切な応答は次のとおりです。

Core Data でこの関係をモデル化するには、モデルを次のように設定する必要があります。

Xcode モデル エディターのスクリーンショット

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 つです)、実行可能です。プラグを差し込んでください!

于 2009-11-17T01:10:20.487 に答える