绑定两个不同的模型,关键路径相同的NSArrayController的选择
说我有字典以下数组:绑定两个不同的模型,关键路径相同的NSArrayController的选择
{
{
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中。这可能吗?有没有更好的方法来解决这个问题?
首先,创建一个表示语言的模型对象类,并使这些模型对象的字典对属性成为可能。根据我的经验,字典对Bindings来说效果不佳。绑定系统需要真实的模型对象。
接下来,创建一个控制器对象来容纳这些模型对象。我将其称为LanguageKeeper。它有三个属性:
-
languages
(语言NSArray的对象) selectedLanguage
selectedLanguageISOName
揭露最后一个为绑定。另外,使另一个属性的最后两个属性派生。我将ISOName属性派生为:getter将返回self.selectedLanguage.ISOName
,setter将执行查找给定的ISO名称并将self.selectedLanguage
设置为该语言对象。确保执行keyPathsForValuesAffectingSelectedLanguage
和keyPathsForValuesAffectingSelectedLanguageISOName
,并在每个方法返回的集合中包含其他属性的名称。
首先,将NSArrayController的内容数组绑定到LanguageKeeper的languages
属性。
然后,在弹出按钮绑定三个属性:
- 内容NSArrayController中的
arrangedObjects
财产,留下模型的关键路径空(或将其设置为self
如果这会导致问题) - 内容值相同的属性
arrangedObjects
,用“fullName
” - 选定对象的所述LanguageKeeper的
selectedLanguage
特性的模型的关键路径
最后,将LanguageKeeper上的selectedLanguageISOName
绑定到User Defaults Controller的相应属性。 (您不能直接将弹出按钮绑定到UDC,因为弹出按钮需要您的模型对象之一)。
您也可以尝试将弹出按钮的内容绑定到isoName
s和content-values绑定到数组中的字典fullName
,但我很不信任使用原始对象作为模型对象。过去我遇到了太多问题。此外,从长远来看,使用模型对象会带来收益,并且与它们合作非常有趣。
因此,与全部到位以上的,这里是发生了什么:
用户更改弹出按钮- 弹出按钮改变其选择的对象属性值的值。
- 这改变了LanguageKeeper的
selectedLanguage
属性。 - 这改变了LanguageKeeper的其他属性(
selectedLanguageISOName
)。 - 通过UDC更改用户默认值。
- 关于该值UDC讯息通知已经改变在用户的默认值的值。
- 这改变了LanguageKeeper的
selectedLanguageISOName
属性。 - 这改变了LanguageKeeper的其他属性(
selectedLanguage
)。 - 这改变了弹出按钮的selected-object属性的值。
- 用户在弹出菜单中看到新选择的
fullName
。
如果您不明白此答案的任何部分,请要求澄清。
对不起,花了这么长时间才回到你身边。我终于实现了你指定的(有一些细微的差别),它的工作非常好。谢谢! – dreamlax 2009-02-27 03:34:29