まず、言語を表すモデルオブジェクトクラスを作成し、これらのディクショナリペアをモデルオブジェクトのプロパティにします。私の経験では、辞書はバインディングではうまく機能しません。Bindingsシステムには、実際のモデルオブジェクトが必要です。
次に、これらのモデルオブジェクトを保持するコントローラーオブジェクトを作成します。これをLanguageKeeperと呼びます。これには3つのプロパティがあります。
languages
(言語オブジェクトのNSArray)
selectedLanguage
selectedLanguageISOName
最後のものをバインディングとして公開します。また、最後の2つのプロパティの1つをもう1つの派生物にします。ISONameプロパティを派生させます。getterはを返しself.selectedLanguage.ISOName
、setterは指定されたISO名のルックアップを実行し、self.selectedLanguage
その言語オブジェクトに設定します。必ずとを実装keyPathsForValuesAffectingSelectedLanguage
しkeyPathsForValuesAffectingSelectedLanguageISOName
、各メソッドが返すセットに他のプロパティの名前を含めてください。
まず、NSArrayControllerのcontent-arrayバインディングをlanguages
LanguageKeeperのプロパティにバインドします。
次に、ポップアップボタンで3つのプロパティをバインドします。
- NSArrayControllerの
arrangedObjects
プロパティにコンテンツを追加し、モデルキーパスを空のままにします(またはself
、問題が発生する場合はに設定します)
arrangedObjects
「<code>fullName」</li>のモデルキーパスを使用し
て、同じプロパティのコンテンツ値selectedLanguage
LanguageKeeperのプロパティに選択されたオブジェクト
最後にselectedLanguageISOName
、LanguageKeeperをUserDefaultsControllerの適切なプロパティにバインドします。(ポップアップボタンにはモデルオブジェクトの1つが必要なため、ポップアップボタンをUDCに直接バインドすることはできません。)
ポップアップボタンのコンテンツバインディングを配列内のディクショナリのsにisoName
バインドし、content-valuesをsにバインドしてみることもできますがfullName
、プリミティブオブジェクトをモデルオブジェクトとして使用することには非常に不信感があります。私は過去にそれからあまりにも多くの問題を抱えていました。さらに、モデルオブジェクトを使用すると、長期的に見れば成果が得られ、操作するのがとても楽しいです。
上記のすべてが整った状態で、次のようになります。
ユーザーがポップアップボタンの値を変更します
- ポップアップボタンは、選択されたオブジェクトのプロパティの値を変更します。
selectedLanguage
これにより、LanguageKeeperのプロパティが変更されます。
selectedLanguageISOName
これにより、LanguageKeeperの他のプロパティ()が変更されます。
- これにより、UDCを介してユーザーのデフォルトの値が変更されます。
他のオブジェクトがユーザーデフォルトの値を変更します
- UDCは、値が変更されたことに関する通知を投稿します。
selectedLanguageISOName
これにより、LanguageKeeperのプロパティが変更されます。
selectedLanguage
これにより、LanguageKeeperの他のプロパティ()が変更されます。
- これにより、ポップアップボタンの選択されたオブジェクトプロパティの値が変更されます。
- ユーザーには
fullName
、ポップアップメニューに新しい選択が表示されます。
この回答の一部がわからない場合は、説明を求めてください。