cocoa - ¿Cuál es la diferencia entre “valores de contenido” y “objetos de contenido”?
cocoa-bindings (2)
Esos se explican en la Referencia de enlaces de cacao para NSPopUpButton , aunque esa referencia no está del todo clara.
Content
es un controlador de matriz que proporciona elementos al botón emergente. El controlador de matriz debe estar vinculado a una matriz. Para determinar cómo se muestra cada elemento de la matriz en el botón emergente, la -description
se envía a cada objeto de la matriz.
Puedes personalizar esto de dos maneras:
Si desea que el enlace de
Selected Object
proporcione un objeto distinto de los elementos de matriz administrados por el controlador de matriz al que se enlazó elContent
, puede vincularContent Objects
a otra controladora de matriz. También podría ser el mismo controlador de matriz pero con una ruta de clave diferente;Si desea que las opciones del botón emergente sean algo diferentes a la descripción de cada elemento de la matriz administrada por el controlador de matriz al que se enlazó el
Content
, puede vincular losContent Values
a otra controladora de matriz que administra una matriz cuyos elementos contienen las opciones emergentes. . También podría ser el mismo controlador de matriz pero con una ruta de clave diferente.
Un ejemplo simple: supongamos que tiene la siguiente clase:
@interface Customer : NSObject
@property (copy) NSString *name;
@property (copy) NSString *phoneNumber;
@end
y usted no ha anulado el método -description
. En este caso, la -description
es inútil y la propiedad de name
sería una buena opción para las opciones emergentes. Te unirías
-
Content
a un controlador de matriz que administra una matriz de instancias delCustomer
, controlador clavearrangedObjects
; -
Content Values
para el mismo controlador de matriz, controlados por la teclaObjetos,name
ruta clave.
Luego puede vincular Selected Object
a otra cosa, por ejemplo, una propiedad en su delegado de aplicación o controlador de ventana. Los enlaces de cacao luego asignarían la instancia de Customer
seleccionada a esa propiedad.
Ahora suponga que no está interesado en el objeto Customer
completo que se ha seleccionado, sino solo en su número de teléfono. En este caso, puede enlazar Content Objects
al mismo controlador de array, la clave del controladorordenadaObjects, model keypath phoneNumber
. Cuando se selecciona una opción emergente, los enlaces de Cocoa establecerán phoneNumber
lugar de una instancia completa del Customer
. En resumen: si no vincula Content Objects
, el Selected Object
representa el objeto original en la matriz. Si vinculas Content Objects
, el Selected Object
puede ser algo diferente.
Debería enlazar el Selected Value
si no estuviera interesado en los objetos originales (o en los objetos de contenido), pero en las cadenas reales que se muestran en las opciones emergentes de acuerdo con los enlaces de Content Values
.
Receta rápida para proporcionar datos al botón emergente:
- Enlace
Content
si tiene objetos (no solo cadenas) que representan las opciones emergentes; - Enlace
Content Values
si las opciones que se muestran al usuario no se pueden obtener a través delContent
mediante el envío de una-description
a los elementos de la matriz; - Vincule los
Content Objects
si desea que elSelected Object
devuelva algo diferente de los elementos de la matriz deContent
.
Receta rápida para obtener la selección actual en un botón emergente:
- Enlace el
Selected Object
si desea conocer el objeto completo (ya sea deContent
oContent Objects
) que representa la selección emergente actual; - Enlace el
Selected Value
si solo desea la cadena que está seleccionada actualmente en la ventana emergente.
Y, por último, usaría la Selected Tag
si las opciones emergentes se toman de un menú cuyos elementos tienen un conjunto de etiquetas.
Estoy explorando enlaces ahora mismo, y tengo un NSPopUpButton -
Me presenta varias opciones para los enlaces en Selección de valor: Content
, Content Objects
Content Value
, Content Value
y luego Selected Object
Selected Value,
Selected Tag
y Selected Tag
. ¿Podría alguien explicar la diferencia entre estos?
#Object
refiere a cualquier objeto compatible con KVC. #ObjectValue
refiere a la ruta de acceso clave utilizada para obtener el valor de ese objeto.
Por lo tanto, para su enlace emergente, ContentObjects estaría ligado a, por ejemplo, los organizados NSArrayController
de NSArrayController
. Digamos que esto se refiere a una matriz de diccionarios u objetos gestionados. No puede presentar un diccionario de forma significativa en una <NSCFDictionary...
emergente (obtiene el inicio de la salida de la description
, por ejemplo, <NSCFDictionary...
o similar), por lo que aquí es donde entra el enlace contentValues. Esto sería algo así como su NSArrayController arrangedObjects.name
, donde name es una clave de su diccionario u objeto gestionado.
Espero que esto ayude, luché con el mismo concepto cuando empecé con los enlaces.