質問

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 でこの関係をモデル化するには、次のようにモデルを設定します。

Xcode Model Editor Screenshot

エンティティにカスタム クラスを与えたことに注意することが重要です (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 つです) が、実行可能です。そのままプラグを差し込んでください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top