1

Say I have the following array of dictionaries:

{
    {
        isoName => en,
        fullName => English,
        localName => English
    },
    {
        isoName => de,
        fullName => German,
        localName => Deutsch
    },
    {
        isoName => fr,
        fullName => French,
        localName => français
    }
}

How can I bind the fullName values to the values of an NSPopUpButton control but bind the selection's isoName to NSUserDefaults? I have an NSArrayController set up with an array like the above, and my NSPopUpButton is bound to this controller with the model key path as "fullName", but I want to keep the isoName in the NSUserDefaults. Is this possible? Is there a better way to approach this?

4

1 に答える 1

1

まず、言語を表すモデルオブジェクトクラスを作成し、これらのディクショナリペアをモデルオブジェクトのプロパティにします。私の経験では、辞書はバインディングではうまく機能しません。Bindingsシステムには、実際のモデルオブジェクトが必要です。

次に、これらのモデルオブジェクトを保持するコントローラーオブジェクトを作成します。これをLanguageKeeperと呼びます。これには3つのプロパティがあります。

  • languages(言語オブジェクトのNSArray)
  • selectedLanguage
  • selectedLanguageISOName

最後のものをバインディングとして公開します。また、最後の2つのプロパティの1つをもう1つの派生物にします。ISONameプロパティを派生させます。getterはを返しself.selectedLanguage.ISOName、setterは指定されたISO名のルックアップを実行し、self.selectedLanguageその言語オブジェクトに設定します。必ずとを実装keyPathsForValuesAffectingSelectedLanguagekeyPathsForValuesAffectingSelectedLanguageISOName、各メソッドが返すセットに他のプロパティの名前を含めてください。

まず、NSArrayControllerのcontent-arrayバインディングをlanguagesLanguageKeeperのプロパティにバインドします。

次に、ポップアップボタンで3つのプロパティをバインドします。

  • NSArrayControllerのarrangedObjectsプロパティにコンテンツを追加し、モデルキーパスを空のままにします(またはself、問題が発生する場合はに設定します)
  • arrangedObjects「<code>fullName」</li>のモデルキーパスを使用し て、同じプロパティのコンテンツ値
  • selectedLanguageLanguageKeeperのプロパティに選択されたオブジェクト

最後にselectedLanguageISOName、LanguageKeeperをUserDefaultsControllerの適切なプロパティにバインドします。(ポップアップボタンにはモデルオブジェクトの1つが必要なため、ポップアップボタンをUDCに直接バインドすることはできません。)

ポップアップボタンのコンテンツバインディングを配列内のディクショナリのsにisoNameバインドし、content-valuesをsにバインドしてみることもできますがfullName、プリミティブオブジェクトをモデルオブジェクトとして使用することには非常に不信感があります。私は過去にそれからあまりにも多くの問題を抱えていました。さらに、モデルオブジェクトを使用すると、長期的に見れば成果が得られ、操作するのがとても楽しいです。

上記のすべてが整った状態で、次のようになります。

ユーザーがポップアップボタンの値を変更します
  1. ポップアップボタンは、選択されたオブジェクトのプロパティの値を変更します。
  2. selectedLanguageこれにより、LanguageKeeperのプロパティが変更されます。
  3. selectedLanguageISONameこれにより、LanguageKeeperの他のプロパティ()が変更されます。
  4. これにより、UDCを介してユーザーのデフォルトの値が変更されます。
他のオブジェクトがユーザーデフォルトの値を変更します
  1. UDCは、値が変更されたことに関する通知を投稿します。
  2. selectedLanguageISONameこれにより、LanguageKeeperのプロパティが変更されます。
  3. selectedLanguageこれにより、LanguageKeeperの他のプロパティ()が変更されます。
  4. これにより、ポップアップボタンの選択されたオブジェクトプロパティの値が変更されます。
  5. ユーザーにはfullName、ポップアップメニューに新しい選択が表示されます。

この回答の一部がわからない場合は、説明を求めてください。

于 2009-02-22T23:35:58.123 に答える