问题
I'm exploring bindings right now, and have an NSPopUpButton -
It presents me a number of options for bindings under Value Selection - Content
, Content Objects
, Content Value
s, and then Selected Object
, Selected Value,
and Selected Tag
. Could someone please explain the difference between these?
回答1:
Those are explained in the Cocoa Bindings Reference for NSPopUpButton, although that reference is not quite clear.
Content
is an array controller that provides elements to the popup button. The array controller should be bound to an array. In order to determine how each element in the array is shown in the popup button, -description
is sent to each object in the array.
You may customise this in two ways:
If you want the
Selected Object
binding to provide an object distinct from the array elements managed by the array controller to whichContent
was bound, you can bindContent Objects
to another array controller. It could also be the same array controller but with a different key path;If you want the popup button options to be something different than the description of each element in the array managed by the array controller to which
Content
was bound, you can bindContent Values
to another array controller that manages an array whose elements contain the popup options. It could also be the same array controller but with a different key path.
A simple example: suppose you have the following class:
@interface Customer : NSObject
@property (copy) NSString *name;
@property (copy) NSString *phoneNumber;
@end
and you haven’t overridden the -description
method. In this case, -description
is useless and the name
property would be a good choice for the popup options. You’d bind:
Content
to an array controller that manages an array ofCustomer
instances, controller keyarrangedObjects
;Content Values
to the same array controller, controller keyarrangedObjects
, model keypathname
.
You can then bind Selected Object
to something else, for example a property in your application delegate or window controller. Cocoa bindings would then assign the selected Customer
instance to that property.
Now suppose you are not interested in the whole Customer
object that’s been selected, but only its phone number. In this case, you can bind Content Objects
to the same array controller, controller key arrangedObjects
, model keypath phoneNumber
. When a popup option is selected, Cocoa bindings will set phoneNumber
instead of an entire Customer
instance. In summary: if you don’t bind Content Objects
, Selected Object
represents the original object in the array. If you bind Content Objects
, then Selected Object
can be something different.
You’d bind Selected Value
if you were not interested in the original objects (or the content objects), but the actual strings shown in the popup options according to the Content Values
bindings.
Quick recipe for providing data to the popup button:
- Bind
Content
if you have objects (not only strings) that represent the popup options; - Bind
Content Values
if the options that are shown to the user cannot be obtained viaContent
by sending-description
to the array elements; - Bind
Content Objects
if you wantSelected Object
to return something different from the array elements fromContent
.
Quick recipe for obtaining the current selection in a popup button:
- Bind
Selected Object
if you want to know the full object (either fromContent
orContent Objects
) representing the current popup selection; - Bind
Selected Value
if you only want the string that’s currently selected in the popup.
And lastly, you’d use Selected Tag
if the popup options are actually taken from a menu whose items have a tag set.
回答2:
#Object
refers to any KVC-compliant object. #ObjectValue
refers to the key path used to get the value from that object.
So, for your pop-up binding, ContentObjects would be bound to, say, an NSArrayController
's arrangedObjects
. Say this refers to an array of dictionaries or managed objects. You can't meaningfully present a dictionary in a pop-up (you get the start of the description
output, e.g <NSCFDictionary...
or similar), so this is where the contentValues binding comes in. This would be something like your NSArrayController's arrangedObjects.name
, where name is a key from your dictionary or managed object.
I hope this helps, I struggled with the same concept myself when I started with bindings.
来源:https://stackoverflow.com/questions/7937280/whats-the-difference-between-content-values-and-content-objects