que ios objective-c iphone uiviewcontroller

ios - que - didMoveToParentViewController y willMoveToParentViewController



uiviewcontroller lifecycle (2)

Básicamente, no hacen nada que puedas notar en la interfaz. "Sin embargo, cualquier subclase permite que se sobrescriban, por lo que si no los llama, no romperá un UIViewController, sino que romperá las subclases que dependen de él (por ejemplo: digamos que una subclase quiere liberar un objeto cuando se elimina de un controlador de vista principal, si no llama al método, nunca liberará el objeto) ". Como fue explicado en los comentarios here .

La documentación de Apple en UIViewController dice:

Si está implementando su propio controlador de vista de contenedor, debe llamar al método willMoveToParentViewController: del controlador de vista secundario antes de llamar al método removeFromParentViewController , pasando un valor primario de nil.

Cuando su contenedor personalizado llama al addChildViewController: llama automáticamente al método willMoveToParentViewController : del controlador de vista para que se agregue como elemento secundario antes de agregarlo.

Si está implementando su propio controlador de vista de contenedor, debe llamar al método didMoveToParentViewController: del controlador de vista secundario después de que se complete la transición al nuevo controlador o, si no hay transición, inmediatamente después de llamar al addChildViewController: .

El método removeFromParentViewController llama automáticamente al método didMoveToParentViewController: del controlador de vista secundario después de que elimina el elemento secundario.

¿Por qué debería llamar a estos métodos? ¿Qué hacen esos métodos?

ProfileViewController *profile = [[ProfileViewController alloc] init]; profile.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); [self addChildViewController:profile]; [self.view addSubview:profile.view]; [profile didMoveToParentViewController:self];

Mi código funciona perfectamente aunque elimine la última línea. ¿Puede alguien ayudarme por favor en esto?

Gracias por adelantado


Estos métodos se utilizan porque es una regla que se debe seguir al agregar o quitar un controlador de vista secundario. Antes de agregar un controlador de vista willMoveToParentViewController , se debe llamar primero al método didMoveToParentViewController seguido del método didMoveToParentViewController . Al eliminar el controlador de vista secundario del controlador de vista principal, estos métodos se deben llamar en orden inverso.

addChildViewController: llama automáticamente a [child willMoveToParentViewController:self] . Entonces, uno debería llamar a didMoveToParentViewController después de addChildViewController: De removeFromParentViewController: similar, removeFromParentViewController: llama automáticamente a [child didMoveToParentViewController:nil] . Entonces, uno debería llamar a willMoveToParentViewController: antes de removeFromParentViewController: