“内容值”和“内容对象”之间的区别是什么

时间:2011-10-29 06:01:20

标签: cocoa cocoa-bindings

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

它为我提供了一些选项,用于在值选择下进行绑定 - ContentContent ObjectsContent Value,然后是Selected ObjectSelected Value,和{ {1}}。有人可以解释一下这些之间的区别吗?

2 个答案:

答案 0 :(得分:35)

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。选择弹出选项后,Cocoa绑定将设置phoneNumber而不是整个Customer实例。总结:如果您不绑定Content ObjectsSelected Object表示数组中的原始对象。如果您绑定Content Objects,则Selected Object可能会有所不同。

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

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

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

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

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

最后,如果弹出选项实际上来自其项目设置了标记的菜单,则使用{{1}}。

答案 1 :(得分:3)

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

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

我希望这会有所帮助,当我开始使用绑定时,我自己也在使用相同的概念。