ios - container - viewcontroller swift
¿Cómo se notifica a un controlador de vista padre que el controlador de vista hijo de se ha eliminado? (1)
Sí, su controlador principal generalmente debe controlar la adición y eliminación de los controladores secundarios, por lo que su segundo enfoque parece más aplicable. Consulte la sección Implementación de un controlador de vista de contenedor de la referencia de clase UIViewController.
Sospecho que podría salirse con la suya, donde el niño se está eliminando, pero Apple es coherente en su documentación y la sesión de la WWDC 2011 sobre Implementación de la contención de UIViewController dice que el controlador del contenedor tiene la responsabilidad de administrar a los niños.
Entonces, en respuesta a su pregunta de cómo un niño informa a un padre que se ha eliminado, no existe un protocolo establecido para eso. Pero esto no es sorprendente porque se presume que el padre iniciará este proceso. Y en la medida en que un niño necesite iniciar este proceso, la documentación sugiere que el padre debe tener una API pública para administrar los controladores infantiles.
Por lo tanto, aunque no existe un protocolo para que un niño informe al padre, sin embargo, hay una API publicada por la cual los padres controladores informan a los niños que han sido movidos / eliminados. Específicamente, cuando el controlador principal está eliminando un elemento secundario, debe llamar a willMoveToParentViewController
. Esta documentación dice explícitamente que debemos realizar esta notificación:
Si está implementando su propio controlador de vista de contenedor, debe llamar al método
willMoveToParentViewController:
del controlador de vista hijo antes de llamar al métodoremoveFromParentViewController
...
Por lo tanto, como se explica en la sección Agregar y quitar un elemento secundario de la Guía de programación del controlador de vista, cuando elimine un elemento secundario, deberíamos:
[childVC willMoveToParentViewController:nil];
[childVC.view removeFromSuperview];
[childVC removeFromParentViewController];
Como era de esperar, la documentación para didMoveToParentViewController
es igualmente inequívoca: cuando agrega un controlador secundario, debe llamar a didMoveToParentViewController
cuando la animación / transición (si corresponde) se realiza. No sé qué pasaría si no llamamos a estos dos métodos de notificación, pero Apple dice que debemos hacerlo y, por lo tanto, parece prudente hacerlo.
Un controlador de vista secundaria se elimina con el siguiente código dentro de la implementación del controlador de vista secundaria:
- (void)commandFinishVC
{
[ self.view removeFromSuperview];
[ self removeFromParentViewController ];
}
El controlador de vista hijo y su vista se eliminaron correctamente, pero ¿cómo se notifica esto al padre? -viewDidDisappear no se llama y -viewDidUnload ha quedado obsoleto.
De los ejemplos que puedo encontrar, siempre se asume que el controlador de vista padre es el originador del evento que designa al niño que se va a eliminar, pero (para mí) el niño debe ser autónomo en su lógica para completarlo.
¿Deben llamarse los métodos de eliminación utilizando la propiedad self.parentViewController y utilizando algo como lo siguiente en el controlador de vista principal?
- (void)commandFinishVC
{
[ childVC.view removeFromSuperview];
[ childVC removeFromParentViewController ];
}