【发布时间】:2011-10-29 06:01:20
【问题描述】:
我现在正在探索绑定,并且有一个 NSPopUpButton -
它在值选择下为我提供了许多绑定选项 - Content、Content Objects、Content Values,然后是 Selected Object、Selected Value, 和 Selected Tag。有人可以解释一下这些之间的区别吗?
【问题讨论】:
标签: cocoa cocoa-bindings
我现在正在探索绑定,并且有一个 NSPopUpButton -
它在值选择下为我提供了许多绑定选项 - Content、Content Objects、Content Values,然后是 Selected Object、Selected Value, 和 Selected Tag。有人可以解释一下这些之间的区别吗?
【问题讨论】:
标签: cocoa cocoa-bindings
这些在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 Objects,Selected Object代表数组中的原始对象。如果绑定Content Objects,那么Selected Object 可以是不同的东西。
如果您对原始对象(或内容对象)不感兴趣,您将绑定 Selected Value,但根据 Content Values 绑定显示在弹出选项中的实际字符串。
为弹出按钮提供数据的快速方法:
Content;Content 向数组元素发送-description 无法获得向用户显示的选项,则绑定Content Values;Selected Object 返回与来自 Content 的数组元素不同的内容,请绑定 Content Objects。在弹出按钮中获取当前选择的快速方法:
Content 或Content Objects),请绑定Selected Object;Selected Value。最后,如果弹出选项实际上取自其项目已设置标签的菜单,则您将使用 Selected Tag。
【讨论】:
selection 不返回原始对象——而是返回一个代理对象。您需要将弹出按钮的Selected Index绑定到阵列控制器的selectionIndex。
Selected Object 绑定到整个对象(用于分配),但不想显示description 的输出而是自定义属性,我该怎么办?
#Object 指任何符合 KVC 的对象。 #ObjectValue 指的是用于从该对象获取值的键路径。
因此,对于您的弹出绑定,ContentObjects 将被绑定到,例如,NSArrayController 的arrangedObjects。假设这指的是字典或托管对象的数组。您不能在弹出窗口中有意义地呈现字典(您会得到 description 输出的开头,例如 <NSCFDictionary... 或类似的),所以这就是 contentValues 绑定的来源。这就像您的 NSArrayController 的arrangedObjects.name,其中 name 是字典或托管对象中的键。
我希望这会有所帮助,当我开始使用绑定时,我自己也在为同样的概念而苦苦挣扎。
【讨论】: