假设我有以下字典数组:
{
{
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。这可能吗?有没有更好的方法来解决这个问题?
答案 0 :(得分:1)
首先,创建一个表示语言的模型对象类,并使这些字典对成为模型对象的属性。根据我的经验,字典与Bindings不兼容; Bindings系统需要真实的模型对象。
接下来,创建一个控制器对象来保存这些模型对象。我称之为LanguageKeeper。它有三个属性:
languages
(语言对象的NSArray)selectedLanguage
selectedLanguageISOName
将最后一个作为绑定公开。另外,使另一个属性的最后两个属性之一。我将使ISOName属性派生:getter将返回self.selectedLanguage.ISOName
,setter将执行给定ISO名称的查找并将self.selectedLanguage
设置为该语言对象。确保实现keyPathsForValuesAffectingSelectedLanguage
和keyPathsForValuesAffectingSelectedLanguageISOName
,并在每个方法返回的集合中包含其他属性的名称。
首先,将NSArrayController的内容数组绑定绑定到LanguageKeeper的languages
属性。
然后,在弹出按钮上绑定三个属性:
arrangedObjects
属性,将模型键路径留空(如果这会导致问题,则将其设置为self
)arrangedObjects
属性,模型关键路径为“fullName
”selectedLanguage
属性最后,将LanguageKeeper上的selectedLanguageISOName
绑定到User Defaults Controller的相应属性。 (您无法将弹出按钮直接绑定到UDC,因为弹出按钮需要您的某个模型对象。)
您还可以尝试将弹出按钮的内容绑定绑定到isoName
和绑定到数组中字典的fullName
的内容值,但我非常不信任使用原始对象作为模型对象。我过去遇到的问题太多了。此外,从长远来看,使用模型对象可以获得回报,而且使用起来非常有趣。
所有上述所有内容都是如此:
用户更改弹出按钮中的值selectedLanguage
属性。selectedLanguageISOName
)。selectedLanguageISOName
属性。selectedLanguage
)。fullName
。如果您不理解此答案的任何部分,请要求澄清。