1

假设我有以下字典数组:

{
    {
        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 中。这可能吗?有没有更好的方法来解决这个问题?

4

1 回答 1

1

首先,创建一个表示语言的模型对象类,并使模型对象的这些字典对属性。根据我的经验,字典不能很好地与 Bindings 配合使用;绑定系统需要真实的模型对象。

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

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

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

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

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

  • content 到 NSArrayController 的arrangedObjects属性,将模型键路径留空(self如果这会导致问题,则将其设置为)
  • 相同arrangedObjects属性的内容值,模型键路径为“<code>fullName”</li>
  • 选择对象到selectedLanguageLanguageKeeper 的属性

最后,将selectedLanguageISONameLanguageKeeper 绑定到 User Defaults Controller 的相应属性。(您不能将弹出按钮直接绑定到 UDC,因为弹出按钮需要您的模型对象之一。)

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

因此,在完成上述所有操作后,会发生以下情况:

用户更改弹出按钮中的值
  1. 弹出按钮更改其 selected-object 属性的值。
  2. 这会改变selectedLanguageLanguageKeeper 的属性。
  3. 这会改变 LanguageKeeper 的另一个属性 ( selectedLanguageISOName)。
  4. 这会通过 UDC 更改用户默认值。
其他一些对象更改了用户默认值
  1. UDC 发布有关值已更改的通知。
  2. 这会改变selectedLanguageISONameLanguageKeeper 的属性。
  3. 这会改变 LanguageKeeper 的另一个属性 ( selectedLanguage)。
  4. 这会改变弹出按钮的 selected-object 属性的值。
  5. 用户fullName在弹出菜单中看到新的选择。

如果您不理解此答案的任何部分,请要求澄清。

于 2009-02-22T23:35:58.123 回答