¿Qué hace addChildViewController realmente?

Simplemente estoy sumergiendo mis pies por primera vez en el desarrollo de iOS, y una de las primeras cosas que he tenido que hacer es implementar uncontrolador de vista de contenedor personalizado - LlamémosloSideBarViewController - que intercambia cuál de los varios controladores de vista secundarios posibles muestra, casi exactamente como un estándarControlador de la barra de pestañas. (Es más o menos unControlador de la barra de pestañas pero con un menú lateral escondible en lugar de una barra de pestañas.)

De acuerdo con las instrucciones en la documentación de Apple, llamoaddChildViewController Cada vez que agregué un ViewController hijo a mi contenedor. Mi código para intercambiar el controlador de vista secundario actual que se muestra por elSideBarViewController Se ve como esto:

- (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];
}

Entonces empecé a tratar de averiguar quéaddChildViewController Hace aquí, y me di cuenta de que no tengo ni idea. Además de pegar lo nuevo.ViewController en el.childViewControllers Array, parece no tener efecto en nada. Las acciones y salidas de la vista del controlador secundario al controlador secundario que he configurado en el guión gráfico todavía funcionan bien incluso si nunca llamoaddChildViewController, y no puedo imaginar que más podría afectar.

De hecho, si reescribo mi código para no llamaraddChildViewController, y en cambio lucir 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, por lo que puedo decir!

La documentación de Apple no arroja mucha luz sobre lo queaddChildViewController lo hace, o por qué se supone que debemos llamarlo. Toda la extensión de la descripción relevante de lo que hace el método o por qué debe utilizarse en su sección en elUIViewController Referencia de clase es, en la actualidad:

Agrega el controlador de vista dado como un niño. ... Este método solo está destinado a ser llamado por una implementación de un controlador de vista de contenedor personalizado. Si reemplaza este método, debe llamar a super en su implementación.

También hay un párrafo anterior en la misma página:

El controlador de la vista de contenedor debe asociar un controlador de vista secundario consigo mismo antes de agregar la vista raíz del elemento secundario a la jerarquía de vistas. Esto permite que iOS direccione los eventos correctamente a los controladores de vista secundarios y las vistas que administran esos controladores. Del mismo modo, después de que elimine la vista raíz de un niño de su jerarquía de vistas, debe 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 los clientes de su clase contenedora; 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 podría necesitar llamar:

addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:

pero no ofrece ninguna pista sobre qué son los "eventos" o el "comportamiento de contención esperado" del que se está hablando, o por qué (o incluso cuándo) llamar a estos métodos es "esencial".

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, por lo que asumo que cumple un propósito importante más allá de simplemente colocar el ViewController en una matriz, pero no puedo entenderlo. ¿Cuál es ese propósito? ¿Qué hace este método y por qué debería llamarlo?

Respuestas a la pregunta(3)

Su respuesta a la pregunta