2011-05-31 11 views
5

Al vincular un contentArray de NSArrayController a un NSUserDefaultsController, debe marcar la casilla de verificación "Maneja el contenido como valor compuesto" en el enlace. Esto se ha convertido en sabiduría convencional, pero ¿qué hace realmente la opción?¿Qué hace NSHandlesContentAsCompoundValueBindingOption de Cocoa binding exactamente?

Escribí una pequeña aplicación de prueba y pude observar que con la opción activada, todo el contentArray se pasa a la fuente de enlace setValue:forKey: cada vez que edita una propiedad de un elemento en la matriz. Cuando la opción está desactivada, solo se modifica el objeto del elemento y no se notifica la fuente de enlace.

Esto explica por qué la opción es necesaria para hacer que NSUserDefaultsController funcione (de lo contrario, no notaría que había editado algo en la matriz y nunca guardará el cambio). Pero no explica quién está haciendo exactamente lo que es diferente. ¿El controlador de array se está haciendo cargo de esta opción y está escribiendo de nuevo la matriz de contenido cuando observa un cambio? Si es así, ¿cómo se relaciona con el propósito declarado de la opción que es "usar un transformador de valor reversible para traducir [...] valores compuestos temporalmente en piezas más pequeñas"?

Respuesta

1

El flujo de mensajes se explica aquí bastante bien: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/MessageFlow.html#//apple_ref/doc/uid/TP40002149-186285

Aquí está mi intento de responder:

  1. El objeto de contenido original especificado por el contentObject, contentArray o contentSet se recupera unión de la NSUserDefaultsController usando valueForKeyPath:
  2. Ese objeto de contenido se transforma utilizando el método transformedValue: del transformador de valor
  3. El nuevo valor desde el usuario se inserta en el objeto de contenido transformado
  4. El objeto de contenido se transforma inversa usando inverseTransformedValue:
  5. El nuevo, objeto de contenido transformada inversa se establece como el nuevo objeto de contenido y se pasa al NSUserDefaultsController usando setValue:forKeyPath:
Cuestiones relacionadas