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
, UINavigationController
y 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 willMoveToParentViewController
antes de llamar addChildViewController
? Este me parece el orden lógico, pero ¿es estrictamente necesario?
¿Es necesario llamar didMoveToParentViewController:nil
después de llamar removeFromParentViewController
?
addChildViewController
debería equilibrarse condidMoveToParentViewController
ywillMoveToParentViewController
debería equilibrarse conremoveFromParentViewController
. Esto es exactamente lo que estaba buscando. No estoy seguro de cómo me lo perdí en los documentos.