将两个不同的模型键路径绑定到相同的NSArrayController选择

时间:2009-02-22 22:00:48

标签: objective-c cocoa interface-builder nsdictionary cocoa-bindings

假设我有以下字典数组:

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

如何将fullName值绑定到NSPopUpButton控件的值,但将选择的isoName绑定到NSUserDefaults?我有一个NSArrayController设置与上面的数组,我的NSPopUpButton绑定到此控制器与模型密钥路径为“fullName”,但我想保持isoName在NSUserDefaults。这可能吗?有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

首先,创建一个表示语言的模型对象类,并使这些字典对成为模型对象的属性。根据我的经验,字典与Bindings不兼容; Bindings系统需要真实的模型对象。

接下来,创建一个控制器对象来保存这些模型对象。我称之为LanguageKeeper。它有三个属性:

  • languages(语言对象的NSArray)
  • selectedLanguage
  • selectedLanguageISOName

将最后一个作为绑定公开。另外,使另一个属性的最后两个属性之一。我将使ISOName属性派生:getter将返回self.selectedLanguage.ISOName,setter将执行给定ISO名称的查找并将self.selectedLanguage设置为该语言对象。确保实现keyPathsForValuesAffectingSelectedLanguagekeyPathsForValuesAffectingSelectedLanguageISOName,并在每个方法返回的集合中包含其他属性的名称。

首先,将NSArrayController的内容数组绑定绑定到LanguageKeeper的languages属性。

然后,在弹出按钮上绑定三个属性:

  • 将内容提供给NSArrayController的arrangedObjects属性,将模型键路径留空(如果这会导致问题,则将其设置为self
  • 内容值为同一arrangedObjects属性,模型关键路径为“fullName
  • 将所选对象添加到LanguageKeeper的selectedLanguage属性

最后,将LanguageKeeper上的selectedLanguageISOName绑定到User Defaults Controller的相应属性。 (您无法将弹出按钮直接绑定到UDC,因为弹出按钮需要您的某个模型对象。)

您还可以尝试将弹出按钮的内容绑定绑定到isoName和绑定到数组中字典的fullName的内容值,但我非常不信任使用原始对象作为模型对象。我过去遇到的问题太多了。此外,从长远来看,使用模型对象可以获得回报,而且使用起来非常有趣。

所有上述所有内容都是如此:

用户更改弹出按钮中的值
  1. 弹出按钮可更改其selected-object属性的值。
  2. 这会更改LanguageKeeper的selectedLanguage属性。
  3. 这会更改LanguageKeeper的其他属性(selectedLanguageISOName)。
  4. 通过UDC更改用户默认值。
  5. 某些其他对象会更改用户默认值中的值
    1. UDC发布有关已更改值的通知。
    2. 这会更改LanguageKeeper的selectedLanguageISOName属性。
    3. 这会更改LanguageKeeper的其他属性(selectedLanguage)。
    4. 这会更改弹出按钮的selected-object属性的值。
    5. 用户在弹出菜单中看到新选择的fullName
    6. 如果您不理解此答案的任何部分,请要求澄清。