2011-12-27 29 views
11

Aunque he buscado mucha información sobre Cocoa Bindings, sigo estando relativamente insatisfecho con la información que tengo y tengo. Parece que el tema es un tanto problemático para muchos y muchos simplemente están evitando este patrón, que creo que no debería ser.Por qué usar NSObjectController

Por supuesto, puede parecer que las consolidaciones son a veces demasiado complicado o tal vez diseñado con demasiada sobrecarga ...

Sin embargo, tengo una pregunta muy directa y específica: ¿Por qué se necesita NSObjectController si puedo establecer fijaciones ¿directamente?

Por ejemplo, el código:

[controller bind:@"contentObject" toObject:self withKeyPath:@"numberOfPieSlices" options:nil]; 

[slicesTextField bind:@"value" toObject:controller withKeyPath:@"content" options:nil]; 
[stepperControl bind:@"value" toObject:controller withKeyPath:@"content" options:nil]; 

Es exactamente lo mismo que:

[slicesTextField bind:@"value" toObject:self withKeyPath:@"numberOfPieSlices" options:nil]; 
    [stepperControl bind:@"value" toObject:self withKeyPath:@"numberOfPieSlices" options:nil]; 

En mi caso aquí, estamos hablando de propiedad de la clase dentro de la cual todo lo que está sucediendo, por lo Supongo que la necesidad de NSObjectController es cuando:

  • ruta de acceso clave para el controlador es el objeto y el enlace de otros controles es necesario a sus propiedades, no a su valor como con primitivas y envoltorios a su alrededor es el caso (numberOfPiesSlices en mi caso es NSInteger)

  • o cuando se necesita vincular desde otros objetos externos, no solo entre objetos dentro de uno

¿Alguien puede confirmar o rechazar esto?

Respuesta

8

Uno de los beneficios/puntos de enlaces es eliminar el código. Con ese fin, NSObjectController etc. tiene el beneficio de que pueden usarse directamente en el constructor de interfaces y configurarse con enlaces a varios elementos de la interfaz de usuario.

Las encuadernaciones solo representan parte de la funcionalidad que se ofrece. Las clases * ObjectController también pueden ocuparse automáticamente de muchos otros controladores más repetitivos (como en el modelo, vista, controlador) que una aplicación generalmente necesita. Por ejemplo, se puede:

  • conectarse a su almacén de datos central y realice los Capta necesarias, inserciones y eliminaciones
  • gestionar la pila de deshacer/rehacer
  • Recoger editado pero no los cambios confirmados a la interfaz de usuario y guardar ellos (por ejemplo, si una ventana está cerrada mientras el foco aún está en un campo de texto editado, esta fue una nueva para mí, la encontré en la respuesta de mmalc en el hilo a continuación).

Si estás haciendo nada de esto, entonces probablemente no es digno de usar NSObjectController. Sus subclases (NSArrayController, etc.) son más útiles.

¡También vea here para una discusión de su pregunta exacta!

+1

Los enlaces de los elementos de la UI pueden vincularse a un controlador de objeto o a otra cosa, como se dice en la pregunta. Entonces, ¿qué código elimina un controlador de objetos? –

+0

El código donde configuró la vinculación, en primer lugar, puede hacerlo en IB con un NSObjectController. ¿A menos que me equivoque y pueda configurar enlaces en IB con objetos de controlador que no sean *? Feliz de ser corregido si es así. – jrturton

+1

No puede configurar un enlace en un objeto simple en IB o el editor de punta, pero puede enlazar * a * un objeto simple. ¿Qué propósito hay para crear un controlador de objeto que no sea vincularlo, y si no hay ninguno, por qué no vincular el control directamente al objeto que necesita para respaldarlo? –

4

¿Por qué es necesario NSObjectController si puedo establecer enlaces directamente?

leí esta pregunta hace unos días, mientras que en busca de alguna información sobre NSObjectController, y hoy sin dejar mi búsqueda, encontré the following passage que parecía relevante a la pregunta: ¿

hay beneficios si el el objeto está obligado a implementar NSEditorRegistration. Esta es una razón por la cual es una buena idea vincular a los objetos del controlador en lugar de vincular directamente al modelo. NSEditorRegistration permite que el enlace informe al controlador que su contenido está en proceso de edición. El controlador realiza el seguimiento cuyas vistas están actualmente editando el contenido del controlador. Si el usuario cierra la ventana, por ejemplo, cada controlador asociado con esa ventana puede indicar a todas esas vistas que confirmen inmediatamente sus ediciones pendientes , y por lo tanto el usuario no perderá ningún dato. Apple proporciona algunos objetos de controlador genéricos (NSObjectController, NSArrayController, NSTreeController) que se pueden utilizar para ajustar sus objetos del modelo , proporcionando la funcionalidad de registro del editor.

Usando un controlador también tiene la ventaja de que el sistema de fijaciones no es la observación directa de su objeto modelo - así que si vas a cambiar de modelo de objetos por uno nuevo (como en una vista de detalle en el que el usuario tiene cambió el registro que se está inspeccionando), puede simplemente reemplazar el objeto modelo dentro del controlador, avisos KVO y las actualizaciones vinculantes .