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
?
fuente
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.Esta parte no es correcta:
Según los documentos:
Entonces no necesitas la
[vc willMoveToParentViewController:self]
llamada. Se hace automáticamente cuando llama[self addChildViewController:vc]
. Aquí está el ejemplo de código nuevamente:Para eliminar los controladores de vista:
Presumiblemente esta llamada lo es
[oldVC didMoveToParentViewController:nil]
.fuente
didMoveToParentViewController
" inmediatamente después de llamar al método addChildViewController:", no especifica cuándo realmente agrega la subvista secundaria. Me pregunto si todo el mundo se habrá equivocado. ¿Hay algún ejemplo en algunos documentos de Apple con el que podamos comparar esto?willMoveToParentViewController
antesaddChildViewController
si el artículo que usted está en movimiento es una clase personalizada con anuladoaddChildViewController
(a menos que su anulación llama internamente)