首先,创建一个表示语言的模型对象类,并使模型对象的这些字典对属性。根据我的经验,字典不能很好地与 Bindings 配合使用;绑定系统需要真实的模型对象。
接下来,创建一个控制器对象来保存这些模型对象。我将其称为 LanguageKeeper。它具有三个属性:
languages
(语言对象的 NSArray)
selectedLanguage
selectedLanguageISOName
将最后一个公开为绑定。另外,使最后两个属性之一成为另一个的导数。我将创建 ISOName 属性派生:getter 将 return self.selectedLanguage.ISOName
,而 setter 将对给定的 ISO 名称执行查找并设置self.selectedLanguage
为该语言对象。确保实现keyPathsForValuesAffectingSelectedLanguage
and keyPathsForValuesAffectingSelectedLanguageISOName
,并在每个方法返回的集合中包含其他属性的名称。
首先,将 NSArrayController 的内容数组绑定绑定到languages
LanguageKeeper 的属性。
然后,在弹出按钮上绑定三个属性:
- content 到 NSArrayController 的
arrangedObjects
属性,将模型键路径留空(self
如果这会导致问题,则将其设置为)
- 相同
arrangedObjects
属性的内容值,模型键路径为“<code>fullName”</li>
- 选择对象到
selectedLanguage
LanguageKeeper 的属性
最后,将selectedLanguageISOName
LanguageKeeper 绑定到 User Defaults Controller 的相应属性。(您不能将弹出按钮直接绑定到 UDC,因为弹出按钮需要您的模型对象之一。)
您还可以尝试将弹出按钮的内容绑定绑定到数组中字典的isoName
s 和内容值绑定fullName
,但是我非常不信任将原始对象用作模型对象。过去我有太多的问题。此外,从长远来看,使用模型对象是有回报的,而且使用起来非常有趣。
因此,在完成上述所有操作后,会发生以下情况:
用户更改弹出按钮中的值
- 弹出按钮更改其 selected-object 属性的值。
- 这会改变
selectedLanguage
LanguageKeeper 的属性。
- 这会改变 LanguageKeeper 的另一个属性 (
selectedLanguageISOName
)。
- 这会通过 UDC 更改用户默认值。
其他一些对象更改了用户默认值
- UDC 发布有关值已更改的通知。
- 这会改变
selectedLanguageISOName
LanguageKeeper 的属性。
- 这会改变 LanguageKeeper 的另一个属性 (
selectedLanguage
)。
- 这会改变弹出按钮的 selected-object 属性的值。
- 用户
fullName
在弹出菜单中看到新的选择。
如果您不理解此答案的任何部分,请要求澄清。