2009-03-05 9 views
8

Tengo una aplicación con un controlador de vista raíz, un controlador de vista principal y un controlador de vista secundario. Me gustaría poder enviar un mensaje al controlador de vista primario desde el controlador de vista secundario. ¿Cómo puedo obtener una referencia a la primaria para que pueda enviarle mensajes? ¿Hay una mejor manera de diseñar esto?Arquitectura de una aplicación de vistas múltiples en el iPhone

Respuesta

0

Si los controladores se cargan desde un NIB, puede definir una salida en el controlador secundario y conectarlo al controlador primario en el generador de interfaz.

7

La respuesta corta: se puede volver a su delegado aplicación como esta:

YourAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 

Usted probablemente ya tiene un puntero a su controlador de vista raíz en su clase de aplicación delegado. Y probablemente tenga punteros a los controladores de vista primario y secundario en el objeto del controlador raíz. Por lo tanto, podría escribir un código como este:

SecondaryViewController *primary = delegate.rootController.primaryController; 

A continuación, puede enviar mensajes a su corazón. No se requieren salidas; solo propiedades para cada controlador de vista.

Hay muchas respuestas más largas y también una discusión sobre por qué esta práctica puede ser cuestionable ya que introduce vínculos potencialmente no deseados entre objetos. En un diseño orientado a objetos "puro", seguirá un patrón de diseño limpio con vínculos claros entre los objetos en varias direcciones, lo que le permite reutilizar mejor el código.

Otra opción es pasar los punteros a los objetos que la clase necesitará en el momento de la inicialización. Implemente un nuevo initWithSomethingOrOther para sus clases de controlador de vista y pase objetos como parámetros. Guarde en caché estos indicadores que necesita (no olvide retenerlos) para usarlos en el futuro.

4

La manera limpia de hacerlo es definir un protocolo para un delegado para el controlador secundario que se enumeran los métodos que necesita el controlador primario para proporcionar:

@protocol SecondaryControllerDelegate <NSObject> 
- (void)secondaryController:(SecondaryController*)secondaryController 
      frobFooWithBar:(Bar*)myBar; 
- (BOOL)secondaryController:(SecondaryController*)secondaryController 
      shouldTwiddleBaz:(Baz*)currentBaz; 
@end 

Ahora añadir un alojamiento delegado a la SecondaryController:

@interface SecondaryController : UIViewController { 
    id <SecondaryControllerDelegate> delegate; 
    ... 
} 

// delegates are one of the few places you don't retain an object 
@property (assign) id <SecondaryControllerDelegate> delegate; 
... 

En la sección Implementación del SecondaryController, sintetice la propiedad de delegado. (No no libérelo en el destructor.) Cuando SecondaryController necesita comunicarse con PrimaryController, debe llamar al método apropiado en el delegado.

Ahora que su PrimaryController implementar el protocolo SecondaryControllerDelegate:

@interface PrimaryController : UIViewController <SecondaryControllerDelegate> { 
... 

implementar los métodos de delegado en PrimaryController.

Finalmente, haga que PrimaryController se configure como el delegado del SecondaryController. Exactamente cómo lo haga dependerá de si crea SecondaryController en un plumín o no. Si lo haces, establece la conexión allí; si no, hágalo justo después de asignar e iniciar el SecondaryController.

¿Por qué haces esta canción y baile?Bueno, cuando tienes que introducir otro controlador entre Primario y Secundario, o usar el Secundario en otra parte de la aplicación, o incluso usar el Secundario en otra aplicación (tengo un controlador que se usa en tres de mis cuatro aplicaciones), no tiene que cambiar SecondaryController en absoluto; simplemente cambia la clase que ahora debería ser su delegado. Este es un increíble ahorro de tiempo en el largo plazo.

0

Utilice NSNotificationCenter para la comunicación desacoplada entre objetos.

+0

+1 para NSNotificationCenter. –

Cuestiones relacionadas