¿Cómo se notifica a un controller de vistas padre que el controller de vistas hijo se ha eliminado?

Un controller de vista secundario se elimina mediante el siguiente código dentro de la implementación del controller de vista secundaria:

- (void)commandFinishVC { [ self.view removeFromSuperview]; [ self removeFromParentViewController ]; } 

El controller de vista secundario y su vista se eliminan correctamente, pero ¿cómo se notifica al padre de familia de esto? -viewDidDisappear no se llama y -viewDidUnload ha quedado en desuso.

A partir de los ejemplos que puedo encontrar, siempre se supone que el controller primario de vista es el originador del evento que nombra al niño que se está eliminando, pero (para mí), el niño debe ser autónomo en su lógica de finalización.

¿Se deben llamar a los methods de eliminación utilizando la propiedad self.parentViewController y utilizando algo similar a lo siguiente en el controller de vista principal?

 - (void)commandFinishVC { [ childVC.view removeFromSuperview]; [ childVC removeFromParentViewController ]; } 

Sí, su controller principal generalmente debe controlar la adición y la eliminación de los controlleres secundarios, por lo que su segundo enfoque parece más aplicable. Consulte la sección Implementación de un controller de vista de contenedor de la Referencia de class UIViewController.

Sospecho que podría salirse con la suya anterior, donde el niño se está eliminando a sí mismo, pero Apple es consistente en su documentation y la session WWDC 2011 sobre la implementación de UIViewController Containment dice que el controller de contenedores tiene la responsabilidad de administrar niños.

Entonces, en respuesta a su pregunta sobre cómo un niño informa a un padre que se lo eliminó, no hay un protocolo establecido para eso. Pero esto no es sorprendente porque se supone que el padre iniciará este process. Y en la medida en que un niño necesita iniciar este process, la documentation sugiere que el padre debe tener una API pública para administrar los controlleres secundarios.

Entonces, aunque no hay un protocolo para un niño que informe al padre, existe, sin embargo, una API publicada por la cual los controlleres parentales informan a los niños que se han movido / eliminado. Específicamente, cuando el controller primario está eliminando un hijo, debería llamar a willMoveToParentViewController . Esta documentation dice explícitamente que debemos realizar esta notificación:

Si está implementando su propio controller de vista de contenedor, debe llamar al método willMoveToParentViewController: del controller de vista secundaria antes de llamar al método removeFromParentViewController

Por lo tanto, como se describe en la sección Agregar y quitar un niño de la Guía de progtwigción del controller de visualización, al eliminar un elemento secundario, deberíamos:

 [childVC willMoveToParentViewController:nil]; [childVC.view removeFromSuperview]; [childVC removeFromParentViewController]; 

Como era de esperar, la documentation para didMoveToParentViewController es igualmente inequívoca: cuando agrega un controller secundario, debe llamar a didMoveToParentViewController cuando se realiza la animation / transición (si la hay). No sé qué sucedería si no llamamos a estos dos methods de notificación, pero Apple dice que debemos hacerlo y, por lo tanto, parece prudente hacerlo.