我正在探索绑定,并且有一个NSPopUpButton -
它为我提供了一些选项,用于在值选择下进行绑定 - Content
,Content Objects
,Content Value
,然后是Selected Object
,Selected Value,
和{ {1}}。有人可以解释一下这些之间的区别吗?
答案 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 Objects
,Selected Object
表示数组中的原始对象。如果您绑定Content Objects
,则Selected Object
可能会有所不同。
如果您对原始对象(或内容对象)不感兴趣,则绑定Selected Value
,但根据Content Values
绑定在弹出选项中显示实际字符串。
为弹出按钮提供数据的快速配方:
Content
; Content Values
向数组元素发送Content
无法通过-description
获取向用户显示的选项,则绑定Content Objects
; Selected Object
返回与Content
中的数组元素不同的内容,请绑定Selected Object
。在弹出按钮中获取当前选择的快速配方:
Content
或Content Objects
),请绑定Selected Value
; Selected Tag
。最后,如果弹出选项实际上来自其项目设置了标记的菜单,则使用{{1}}。
答案 1 :(得分:3)
#Object
指任何符合KVC标准的对象。 #ObjectValue
指的是用于从该对象获取值的关键路径。
因此,对于弹出式绑定,ContentObjects将绑定到NSArrayController
的{{1}}。假设这是指一组字典或托管对象。你不能在弹出窗口中有意义地呈现字典(你得到arrangedObjects
输出的开头,例如description
或类似的),所以这就是contentValues绑定的来源。这将是像你的NSArrayController的<NSCFDictionary...
,其中name是你的字典或托管对象的密钥。
我希望这会有所帮助,当我开始使用绑定时,我自己也在使用相同的概念。