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
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.
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.
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.
Utilice NSNotificationCenter para la comunicación desacoplada entre objetos.
- 1. IPhone OpenGL ES vistas individuales o múltiples?
- 2. Múltiples vistas dentro de un XIB - SDK de iPhone
- 3. Preguntas sobre la estructura de la aplicación de iPhone: datos centrales, vistas, vistas modales, etc.
- 4. ¿Cómo crear varias ventanas/vistas en el iPhone?
- 5. Building C# .NET aplicación de Windows con múltiples vistas
- 6. Android: actividad única, vistas múltiples
- 7. ¿Diseñar una aplicación de iPhone compleja?
- 8. Aplicación de iPhone para solo paisaje con múltiples plumillas
- 9. WPF CollectionViewSource ¿Vistas múltiples?
- 10. Arquitectura para la aplicación SaaS de RoR
- 11. iOS - UISplitViewController con storyboard - múltiples vistas maestras y múltiples vistas de detalles
- 12. Arquitectura de una aplicación PHP en Amazon EC2
- 13. Necesito diseñar el diseño de arquitectura de una aplicación de Android
- 14. NS (Array | Tree) Arquitectura del controlador para NSViewControllers múltiples
- 15. ¿Supervisa el uso de memoria en una aplicación de iphone?
- 16. Incrustar Python en una aplicación de iPhone
- 17. ¿Puedo iniciar una aplicación desde otra aplicación en el iPhone
- 18. Imágenes SVG en una aplicación de iPhone
- 19. Desarrollo de iPhone: aplicación compleja que usa varias vistas/xib/nib
- 20. Cómo mostrar datos de SQlite en vistas de tabla a la aplicación de iPhone
- 21. Implementación de pantallas múltiples en una aplicación
- 22. Una aplicación de iOS con múltiples marcas
- 23. Paquetes múltiples en una aplicación de Android
- 24. ¿Múltiples cuentas de desarrollador de iPhone en una Mac?
- 25. MVC - Misma URL, múltiples vistas
- 26. Un modelo de dominio, múltiples vistas json
- 27. "Arquitectura incorrecta" al intentar instalar la aplicación iPhone en mi dispositivo de desarrollo
- 28. paquete de aplicaciones múltiples en una aplicación
- 29. ¿Enfoque de mejores prácticas para vistas múltiples en meteoritos?
- 30. aplicación para el iPhone con múltiples puntos de vista/subvistas: La memoria no se está desasignado
+1 para NSNotificationCenter. –