绑定两个不同的模型,关键路径相同的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设置为该语言对象。确保执行keyPathsForValuesAffectingSelectedLanguagekeyPathsForValuesAffectingSelectedLanguageISOName,并在每个方法返回的集合中包含其他属性的名称。

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

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

  • 内容NSArrayController中的arrangedObjects财产,留下模型的关键路径空(或将其设置为self如果这会导致问题)
  • 内容值相同的属性arrangedObjects,用“fullName
  • 选定对象的所述LanguageKeeper的selectedLanguage特性的模型的关键路径

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

您也可以尝试将弹出按钮的内容绑定到isoName s和content-values绑定到数组中的字典fullName,但我很不信任使用原始对象作为模型对象。过去我遇到了太多问题。此外,从长远来看,使用模型对象会带来收益,并且与它们合作非常有趣。

因此,与全部到位以上的,这里是发生了什么:

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

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

+0

对不起,花了这么长时间才回到你身边。我终于实现了你指定的(有一些细微的差别),它的工作非常好。谢谢! – dreamlax 2009-02-27 03:34:29