【问题标题】:Binding two different model-key-paths to the same NSArrayController selection将两个不同的模型键路径绑定到同一个 NSArrayController 选择
【发布时间】:2009-07-01 04:36:41
【问题描述】:

假设我有以下字典数组:

{
    {
        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”,但我想在 NSUserDefaults 中保留isoName。这可能吗?有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: objective-c cocoa interface-builder nsdictionary cocoa-bindings


    【解决方案1】:

    首先,创建一个表示语言的模型对象类,并使这些字典对属性成为模型对象。根据我的经验,字典不能很好地与 Bindings 配合使用; 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,因为弹出按钮需要您的模型对象之一。)

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

    以上所有内容都已准备就绪,接下来会发生什么:

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

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

    【讨论】:

    • 抱歉,花了这么长时间才回复您。我终于按照您的要求实现了(有一些细微差别),效果很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 2020-05-29
    相关资源
    最近更新 更多