iphone - Cuándo usar addChildViewController vs pushViewController
uiviewcontroller (1)
Sí, pushViewController:
es para los controladores de navegación que administran una pila de controladores de visualización. addChildViewController:
por otro lado, es parte de una función de iOS 5 llamada "ver la contención del controlador".
La idea básica detrás de esto es que puede incorporar sus controladores de visualización a otros controladores de vista (por ejemplo, cuando transfiere una aplicación de iPhone al iPad) y así realizar su propia implementación de cosas como controladores de navegación, controladores de vista dividida, etc.
Un problema con una implementación como la que muestra es que solo maneja vistas. Los eventos de controlador de vista, como los cambios de orientación, no se transmitirán correctamente en la jerarquía. La contención del control de vista intenta garantizar que todos los controladores de vista contenidos también reciban los mensajes apropiados.
En cuanto a su implementación, también debe pensar en lo que realmente quiere lograr con esto. Un controlador de navegación puede ser lo correcto o incluso puede mostrar el siguiente controlador de forma modal (ver https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/PresentingaViewController.html ) Una ventaja cuando se utilizan estos métodos (por ejemplo, navegación controladores y vistas modales) es que el usuario ya está familiarizado con esas técnicas de navegación.
En cualquier caso, https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ es una buena lectura sobre cómo hacer la transición entre los controladores de visualización.
Al utilizar la contención del controlador de vista, básicamente debe agregar la vista a la vista que lo contiene como de costumbre (esto tiene que hacerse incluso si se agrega el controlador). Luego usa addChildViewController:
para agregar el controlador de vista secundario al que lo rodea. También debe notificar al controlador secundario mediante didMoveToParentViewController:
que se ha puesto en otro controlador. También puede usar transitionFromViewController:toViewController:
para intercambiar un controlador de vista por otro, opcionalmente dando una animación.
Acabo de ver una presentación de la WWDC
2011 sobre "Implementación de la contención de UIViewController" ( aquí hay un enlace al video )
Mencionaron ambas formas de agregar ViewControllers a la pantalla, y agradecería alguna aclaración sobre las mejores prácticas ...
addChildViewController / removeFromParentViewController
se usa con @property (no atómico, solo) NSArray * childViewControllers y [self transitionFromViewController:currentView toViewController:nextView duration: options: animations: completion:];
pushViewController: animado: / popViewControllerAnimated
ellos rápidamente pasaron por alto esto en la presentación
En mis aplicaciones utilizo todos los controles de vista personalizados, y hasta hoy siempre los he gestionado con:
[nextController performSelector:@selector(setDelegate:) withObject:self];
[currentPageController.view removeFromSuperview];
[self.view addSubview:nextController.view];
Pero ahora entiendo que esta es una mala práctica, y me pregunto cuál es la forma correcta de usar "addChildViewController" y cuál es la forma correcta de usar "pushViewController"?
¡Realmente aprecio tus pensamientos sobre el asunto!