Vista de routing de iOS ¿Aparece en los controlleres de vista secundarios?

Agrego un controller de vista secundaria a un controller de vista principal, y todo funciona como se esperaba, excepto que el controller de vista secundaria no está activando sus devoluciones de llamada habituales. Por ejemplo, cosas como viewWillAppear (animated) nunca se llama. Lo busqué y pensé que podría ser porque no llamaba a willMoveToParentViewController y didMoveToParentViewController en el controller de vista secundaria antes y después de agregarlo al padre, respectivamente. Desafortunadamente, arreglar eso no ha hecho ninguna diferencia. ¿Alguien sabe cómo puedo conectar esto para que cuando hago addChildViewController y removeChildViewController se activan las devoluciones de llamada normales? Después de agregar childViewController, también agrego su vista como una subvista a la vista del controller de vista principal. En ninguno de los puntos (addChildViewController & addSubview) se visualiza el método child view viewWillAppear (animated), etc …

Mella

viewWillAppear , viewDIdAppear se invoca automáticamente al agregar la vista ViewControler a una jerarquía de vistas

viewWillDisappear , viewDidDisappear se llama automáticamente al eliminar la vista ViewControler desde una jerarquía de vista

Tal vez no se llamen a estos methods porque está agregando la vista del subcontroller antes de mostrar el controller de la vista principal y, por lo tanto, su vista principal no está en la propia hierarchy de vista?

Cuando su controller de vista principal aparece o desaparece, debe llamar a estos methods para childs en los methods correspondientes.

No estoy seguro si esto puede aplicarse a su situación, pero trate de experimentar con el envío manual de methods de retorno de llamada de aspecto a sus hijos.

Desde la documentation de contención del controller de vista de Apple:

Sin embargo, a veces el comportamiento pnetworkingeterminado puede enviar esos events en un order que no tiene sentido para su contenedor. Por ejemplo, si varios niños cambian simultáneamente su estado de vista, es posible que desee consolidar los cambios para que las devoluciones de llamada de todos sucedan al mismo time en un order más lógico. Para hacer esto, modifica su class de contenedor para hacerse cargo de la apariencia o rotation de las devoluciones de llamada.

Se recomienda reenviar manualmente las llamadas de retorno de aspecto a sus hijos si desea un control más preciso:

// From the container view controller - (BOOL) shouldAutomaticallyForwardAppearanceMethods { return NO; } -(void) viewWillAppear:(BOOL)animated { [self.child beginAppearanceTransition: YES animated: animated]; } -(void) viewDidAppear:(BOOL)animated { [self.child endAppearanceTransition]; } -(void) viewWillDisappear:(BOOL)animated { [self.child beginAppearanceTransition: NO animated: animated]; } -(void) viewDidDisappear:(BOOL)animated { [self.child endAppearanceTransition]; } 

Prueba esta:

 childController.willMoveToParentViewController(self) childController.beginAppearanceTransition(true, animated: true) 

después de agregarlo al controller de vista

Simplemente intenté hacer lo siguiente en viewDidLoad en el viewcontroller primario y parece funcionar

 ChildExperimentViewController *child = [[ChildExperimentViewController alloc]init]; [self addChildViewController:child]; [self.view addSubview:child.view]; [child didMoveToParentViewController:self]; 
 let vc = ChildVC.init() vc.frame = self.view.bounds self.addChildViewController(vc) self.view.addSubview(vc.view) vc.willMove(toParentViewController: self) vc.didMove(toParentViewController: self) 

Respuesta de Chourobin en Swift:

 override var shouldAutomaticallyForwardAppearanceMethods: Bool { return false } override func viewWillAppear(_ animated: Bool) { self.childViewControllers[self.segmentView.selectedSegmentIndex].beginAppearanceTransition(true, animated: animated) } override func viewDidAppear(_ animated: Bool) { self.childViewControllers[self.segmentView.selectedSegmentIndex].endAppearanceTransition() } override func viewWillDisappear(_ animated: Bool) { self.childViewControllers[self.segmentView.selectedSegmentIndex].beginAppearanceTransition(false, animated: animated) } override func viewDidDisappear(_ animated: Bool) { self.childViewControllers[self.segmentView.selectedSegmentIndex].endAppearanceTransition() } 

PS Como no estoy manteniendo la reference a un VC hijo como una propiedad o una variable. Prefiero acceder a él utilizando el índice de segmentos actualmente seleccionado. SegmentView es un UISegmentControl de un tercero.

Puede llamar manualmente a la vista del controller de vista secundario. WillAppear en parectViewController, un código como este

 -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [selectedViewController viewWillAppear:animated]; } 

si tiene un controlController como childViewController, puede agregar un código como este en el delegado de navigationController

 -(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [viewController viewWillAppear:animated]; } 

si agrega un tabBarController como childViewController, puede agregar un código como este en el delegado y super visión de tabBarController.

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.tabBarController.selectedViewController viewWillAppear:animated]; } - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { [viewController viewWillAppear:NO]; } 

No sé si esto puede resolver tu problema, espero poder ayudarte.