【问题标题】:What's the Difference between "Content Values" and "Content Objects"“内容值”和“内容对象”有什么区别
【发布时间】:2011-10-29 06:01:20
【问题描述】:

我现在正在探索绑定,并且有一个 NSPopUpButton -

它在值选择下为我提供了许多绑定选项 - ContentContent ObjectsContent Values,然后是 Selected ObjectSelected Value,Selected Tag。有人可以解释一下这些之间的区别吗?

【问题讨论】:

    标签: cocoa cocoa-bindings


    【解决方案1】:

    这些在Cocoa Bindings Reference for NSPopUpButton 中进行了解释,尽管该参考并不十分清楚。

    Content 是一个数组控制器,为弹出按钮提供元素。数组控制器应该绑定到一个数组。为了确定数组中的每个元素如何在弹出按钮中显示,-description 被发送到数组中的每个对象。

    您可以通过两种方式对其进行自定义:

    • 如果您希望Selected Object 绑定提供与Content 绑定到的数组控制器管理的数组元素不同的对象,您可以将Content Objects 绑定到另一个数组控制器。也可以是同一个数组控制器,但键路径不同;

    • 如果您希望弹出按钮选项与Content 绑定到的阵列控制器管理的阵列中每个元素的描述不同,您可以将Content Values 绑定到另一个阵列控制器管理一个数组,其元素包含弹出选项。它也可以是同一个数组控制器,但具有不同的键路径。

    一个简单的例子:假设你有以下类:

    @interface Customer : NSObject
    @property (copy) NSString *name;
    @property (copy) NSString *phoneNumber;
    @end
    

    并且您还没有覆盖 -description 方法。在这种情况下,-description 是无用的,name 属性将是弹出选项的不错选择。你会绑定:

    • Content 到管理Customer 实例数组的阵列控制器,控制器密钥arrangedObjects
    • Content Values 到同一个阵列控制器,控制器键arrangedObjects,模型键路径name

    然后您可以将Selected Object 绑定到其他东西,例如应用程序委托或窗口控制器中的属性。然后 Cocoa 绑定会将选定的 Customer 实例分配给该属性。

    现在假设您对被选中的整个 Customer 对象不感兴趣,而只对它的电话号码感兴趣。在这种情况下,您可以将Content Objects 绑定到同一个阵列控制器,控制器键arrangedObjects,模型键路径phoneNumber。选择弹出选项时,可可绑定将设置 phoneNumber,而不是整个 Customer实例。综上所述:如果不绑定Content ObjectsSelected Object代表数组中的原始对象。如果绑定Content Objects,那么Selected Object 可以是不同的东西。

    如果您对原始对象(或内容对象)不感兴趣,您将绑定 Selected Value,但根据 Content Values 绑定显示在弹出选项中的实际字符串。

    为弹出按钮提供数据的快速方法:

    • 如果您有代表弹出选项的对象(不仅仅是字符串),则绑定 Content
    • 如果通过Content 向数组元素发送-description 无法获得向用户显示的选项,则绑定Content Values
    • 如果您希望 Selected Object 返回与来自 Content 的数组元素不同的内容,请绑定 Content Objects

    在弹出按钮中获取当前选择的快速方法:

    • 如果您想知道代表当前弹出选择的完整对象(来自ContentContent Objects),请绑定Selected Object
    • 如果您只想要当前在弹出窗口中选择的字符串,请绑定 Selected Value

    最后,如果弹出选项实际上取自其项目已设置标签的菜单,则您将使用 Selected Tag

    【讨论】:

    • 绝妙的答案!当我学习这些东西时,像你这样的人在哪里?
    • 哇——这让一切变得更清晰了!在提出问题之前,我确实阅读了文档,但它们没有帮助 - 感谢您的全面解释。
    • 快速,几乎不相关的问题 - 如果我想将按钮与相同的数组控制器“当前选择”绑定,我将如何去做?如果我尝试将“选定对象”绑定到“选择”,我会在按钮中显示 - 也许我没有正确理解它。
    • @Nano8Blazex 正如你所注意到的,selection 不返回原始对象——而是返回一个代理对象。您需要将弹出按钮的Selected Index绑定到阵列控制器的selectionIndex
    • 很好的答案。如果我确实想将Selected Object 绑定到整个对象(用于分配),但不想显示description 的输出而是自定义属性,我该怎么办?
    【解决方案2】:

    #Object 指任何符合 KVC 的对象。 #ObjectValue 指的是用于从该对象获取值的键路径。

    因此,对于您的弹出绑定,ContentObjects 将被绑定到,例如,NSArrayControllerarrangedObjects。假设这指的是字典或托管对象的数组。您不能在弹出窗口中有意义地呈现字典(您会得到 description 输出的开头,例如 <NSCFDictionary... 或类似的),所以这就是 contentValues 绑定的来源。这就像您的 NSArrayController 的arrangedObjects.name,其中 name 是字典或托管对象中的键。

    我希望这会有所帮助,当我开始使用绑定时,我自己也在为同样的概念而苦苦挣扎。

    【讨论】:

      猜你喜欢
      • 2013-06-05
      • 2022-08-12
      • 2018-08-04
      • 2021-01-24
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      相关资源
      最近更新 更多