En la WWDC 2011 Sesión 102, Apple introdujo Vista Controlador de contención, que es la capacidad de crear la vista personalizada contenedores controlador, de forma análoga a UITabBarController, UINavigationControllery similares.
Vi los ejemplos varias veces. Hay una serie de métodos asociados con este patrón, pero fue un poco difícil descifrarlos exactamente. Voy a publicar aquí lo que creo que está sucediendo y veré si la comunidad confirma o desautoriza mis sospechas.
Escenario 1: Pasar de no tener padre a un nuevo controlador de vista padre
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];
¿Tienen que aparecer las dos primeras líneas en el orden indicado o pueden invertirse?
Escenario 2: pasar de un controlador de vista principal a ningún controlador de vista principal
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
¿También es necesario llamar [vc didMoveToParentViewController:nil]? Los ejemplos de la Sesión 102 no hicieron esto en este escenario, pero no sé si fue una omisión o no.
Escenario 3: pasar de un controlador de vista principal a otro
Es probable que esto ocurra de la siguiente manera, porque la lógica en cada controlador de vista principal estará encapsulada.
// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];
Preguntas
Mi pregunta principal es la siguiente: ¿Así es como debería funcionar la contención del controlador de vista, en general? ¿Son correctas las mecánicas dadas arriba?
¿Es necesario llamar willMoveToParentViewControllerantes de llamar addChildViewController? Este me parece el orden lógico, pero ¿es estrictamente necesario?
¿Es necesario llamar didMoveToParentViewController:nildespués de llamar removeFromParentViewController?
addChildViewControllerdebería equilibrarse condidMoveToParentViewControllerywillMoveToParentViewControllerdebería equilibrarse conremoveFromParentViewController. Esto es exactamente lo que estaba buscando. No estoy seguro de cómo me lo perdí en los documentos.