Acabo de sumergirme por primera vez en el desarrollo de iOS, y una de las primeras cosas que tuve que hacer es implementar un controlador de vista de contenedor personalizado , llamémoslo SideBarViewController
, que intercambia cuál de varios posibles controladores de vista infantil es muestra, casi exactamente como un controlador de barra de pestañas estándar . (Es más o menos un controlador de barra de pestañas pero con un menú lateral que se puede ocultar en lugar de una barra de pestañas).
Según las instrucciones de la documentación de Apple, llamo addChildViewController
cada vez que agrego un ViewController secundario a mi contenedor. Mi código para cambiar el controlador de vista infantil actual se muestra SideBarViewController
así:
- (void)showViewController:(UIViewController *)newViewController {
UIViewController* oldViewController = [self.childViewControllers
objectAtIndex:0];
[oldViewController removeFromParentViewController];
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self addChildViewController: newViewController];
[self.view addSubview: newViewController.view];
}
Luego comencé a tratar de averiguar qué addChildViewController
hace aquí, y me di cuenta de que no tenía ni idea. Además de colocar lo nuevo ViewController
en la .childViewControllers
matriz, parece que no tiene ningún efecto en nada. Las acciones y salidas desde la vista del controlador infantil al controlador infantil que configuré en el guión gráfico todavía funcionan bien incluso si nunca llamo addChildViewController
, y no puedo imaginar qué más podría afectar.
De hecho, si reescribo mi código para no llamar addChildViewController
y, en cambio, me veo así ...
- (void)showViewController:(UIViewController *)newViewController {
// Get the current child from a member variable of `SideBarViewController`
UIViewController* oldViewController = currentChildViewController;
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self.view addSubview: newViewController.view];
currentChildViewController = newViewController;
}
... entonces mi aplicación todavía funciona perfectamente, ¡hasta donde yo sé!
La documentación de Apple no arroja mucha luz sobre qué lo addChildViewController
hace, o por qué se supone que debemos llamarlo. El alcance completo de la descripción relevante de lo que hace el método o por qué debería usarse en su sección en la UIViewController
Referencia de clase es, en la actualidad:
Agrega el controlador de vista dado como hijo. ... Este método solo está destinado a ser llamado por una implementación de un controlador de vista de contenedor personalizado. Si anula este método, debe llamar a super en su implementación.
También está este párrafo anterior en la misma página:
Su controlador de vista de contenedor debe asociar un controlador de vista secundario consigo mismo antes de agregar la vista raíz del niño a la jerarquía de vistas. Esto permite que iOS enrute correctamente los eventos a los controladores de vista infantil y las vistas que administran esos controladores. Del mismo modo, después de eliminar la vista raíz de un niño de su jerarquía de vistas, debería desconectar ese controlador de vista secundario de sí mismo. Para hacer o deshacer estas asociaciones, su contenedor llama a métodos específicos definidos por la clase base. Estos métodos no están destinados a ser llamados por clientes de su clase de contenedor; solo deben ser utilizados por la implementación de su contenedor para proporcionar el comportamiento de contención esperado.
Estos son los métodos esenciales a los que puede necesitar llamar:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
pero no ofrece ninguna pista sobre cuáles son los 'eventos' o el 'comportamiento de contención esperado' de los que está hablando, o por qué (o incluso cuándo) llamar a estos métodos es 'esencial'.
Todos los ejemplos de controladores de vista de contenedor personalizados en la sección "Controladores de vista de contenedor personalizados" de la documentación de Apple llaman a este método, así que supongo que tiene un propósito importante más allá de simplemente colocar el ViewController secundario en una matriz, pero no puedo entender averiguar cuál es ese propósito. ¿Qué hace este método y por qué debería llamarlo?