代码之家  ›  专栏  ›  技术社区  ›  dreamlax

将两个不同的模型密钥路径绑定到同一个NSarrayController选择

  •  1
  • dreamlax  · 技术社区  · 16 年前

    假设我有以下字典数组:

    {
        {
            isoName => en,
            fullName => English,
            localName => English
        },
        {
            isoName => de,
            fullName => German,
            localName => Deutsch
        },
        {
            isoName => fr,
            fullName => French,
            localName => français
        }
    }
    

    我怎么装订 fullName 值与nspopupbutton控件的值相同,但绑定所选内容的 isoName 要确保默认值?我有一个NSarrayController,它使用上面这样的数组设置,并且我的nspopupButton绑定到此控制器,模型密钥路径为“fullname”,但我想保留 同名 在nsuserdefaults中。这有可能吗?有没有更好的方法来解决这个问题?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Peter Hosey    16 年前

    首先,创建一个表示语言的模型对象类,并使这些字典对模型对象的属性。根据我的经验,字典不能很好地处理绑定;绑定系统需要真正的模型对象。

    接下来,创建一个控制器对象来保存这些模型对象。我叫它语言管理员。它有三个特性:

    • languages (语言对象数组)
    • selectedLanguage
    • selectedLanguageISOName

    将最后一个作为绑定公开。另外,把另一个的最后两个性质导数中的一个做出来。我要做一个相同的属性派生:getter会返回 self.selectedLanguage.ISOName 和setter将执行给定ISO名称和集合的查找 self.selectedLanguage 到那个语言对象。确保实施 keyPathsForValuesAffectingSelectedLanguage keyPathsForValuesAffectingSelectedLanguageISOName ,并在每个方法返回的集合中使用另一个属性的名称。

    首先,将nsarraycontroller的内容数组绑定到 语言 LanguageKeeper的属性。

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

    • NSarraycontroller的内容 arrangedObjects 属性,使模型密钥路径为空(或将其设置为 self 如果这导致了问题)
    • 内容值相同 排列对象 属性,模型密钥路径为__ fullName 艾斯
    • 所选对象到 选定的语言 语言管理员的属性

    最后,绑定 选定语言名称 在LanguageKeeper上设置为用户默认控制器的相应属性。(不能将弹出按钮直接绑定到UDC,因为弹出按钮需要一个模型对象。)

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

    因此,在所有上述工作就绪的情况下,会发生以下情况:

    用户更改弹出按钮中的值
    1. 弹出按钮更改其选定对象属性的值。
    2. 这改变了 选定的语言 LanguageKeeper的属性。
    3. 改变了另一个属性( 选定语言名称 )语言管理员。
    4. 这将通过UDC更改用户默认值中的值。
    其他一些对象更改用户默认值中的值
    1. UDC发布有关已更改值的通知。
    2. 这改变了 选定语言名称 LanguageKeeper的属性。
    3. 改变了另一个属性( 选定的语言 )语言管理员。
    4. 这将更改弹出按钮的“选定对象”属性的值。
    5. 用户看到新选择的 全名 在弹出菜单中。

    如果你不理解这个答案的任何部分,请要求澄清。