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

Ver*_*ous 19 cocoa cocoa-bindings

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

它提出我的一些选项下的价值选择绑定- ,,Content s,然后,和.有人可以解释一下这些之间的区别吗?Content ObjectsContent ValueSelected ObjectSelected Value,Selected Tag

小智 36

这些在NSPopUpButtonCocoa Bindings Reference中有解释,尽管该引用并不十分清楚.

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

您可以通过两种方式自定义它:

  • 如果希望Selected Object绑定提供与绑定的数组控制器管理的数组元素不同的对象,Content则可以绑定Content Objects到另一个数组控制器.它也可以是相同的阵列控制器,但具有不同的密钥路径;

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

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

@interface Customer : NSObject
@property (copy) NSString *name;
@property (copy) NSString *phoneNumber;
@end
Run Code Online (Sandbox Code Playgroud)

并且您没有覆盖该-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如果你想知道代表当前弹出选择的完整对象(来自ContentContent Objects);
  • Selected Value如果您只想要弹出窗口中当前选中的字符串,请绑定.

最后,Selected Tag如果弹出选项实际上来自其项目具有标记集的菜单,则可以使用.