UIViewController viewWillAppear no se llama al agregar como subView

Tengo un UIViewController que estoy cargando desde otro controller de vista y luego agregando su vista a un UIScrollView .

 self.statisticsController = [self.storyboard instantiateViewControllerWithIdentifier:@"StatisticsViewController"]; self.statisticsController.match = self.match; [self.scrollView addSubview:self.statisticsController.view]; 

He puesto puntos de interrupción en el controller de vista de statistics y se llama a viewWillAppear pero no se ve a viewWillAppear .

¿Es porque no estoy empujando a la jerarquía o algo así?

Debe agregar statisticsController como un controller de vista secundaria del controller cuya vista lo está agregando.

 self.statisticsController = [self.storyboard instantiateViewControllerWithIdentifier:@"StatisticsViewController"]; self.statisticsController.match = self.match; [self.scrollView addSubview:self.statisticsController.view]; [self addChildViewController:self.statisticsController]; [self.statisticsController didMoveToParentViewController:self]; 

No estoy seguro de que esto haga que viewDidAppear se llame, pero puedes anular didMoveToParentViewController: en el controller secundario, y se llamará, para que puedas poner cualquier código que hayas colocado en viewDidAppear allí.

Me encuentro -viewWillAppear: no se llama problema de nuevo. Después de search en Google, vine aquí. Hice algunas testings y descubrí que el order de -addSubview de -addSubview y -addChildViewController: es importante.

El caso 1. activará -viewWillAppear: del controller, pero Case 2, NO llamará -viewWillAppear:

Caso 1:

  controller?.willMoveToParentViewController(self) // Call addSubview first self.scrollView.addSubview(controller!.view) self.addChildViewController(controller!) controller!.didMoveToParentViewController(self) 

Caso 2:

  controller?.willMoveToParentViewController(self) // Call adChildViewController first self.addChildViewController(controller!) self.scrollView.addSubview(controller!.view) controller!.didMoveToParentViewController(self) 

De forma pnetworkingeterminada, las devoluciones de llamada de aspecto se reenvían automáticamente a los niños. Se determina con la propiedad shouldAutomaticallyForwardAppearanceMethods . Compruebe el valor de esta propiedad, si es NO y si su hijo viewController debe aparecer justo en la apariencia del contenedor, debe notificar al niño con los siguientes methods en la implementación del ciclo de vida del controller del contenedor:

 - (void)viewWillAppear:(BOOL)animated { for (UIViewController *child in self.childViewControllers) { [child beginAppearanceTransition:YES animated:animated]; } } - (void)viewDidAppear:(BOOL)animated { [self.child endAppearanceTransition]; } - (void)viewWillDisappear:(BOOL)animated { for (UIViewController *child in self.childViewControllers) { [child beginAppearanceTransition:NO animated:animated]; } } - (void)viewDidDisappear:(BOOL)animated { [self.child endAppearanceTransition]; } 

Personalizar el aspecto y la rotation del comportamiento de callback

Solucionado mi problema Espero que sea de ayuda.

Por Apple ( https://developer.apple.com/library/content/featunetworkingarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html ), el order correcto de las llamadas de la API para agregar un controller de vista secundaria es:

 [self addChildViewController:childVC]; [self.view addSubview:childVC.view]; [childVC didMoveToParentViewController:self]; 

Pero todavía tenía el problema donde viewWillAppear en el VC hijo no se llamaba esporádicamente. Mi problema era que había una condición de carrera que podía hacer que el código anterior se ejecutara antes de que se llamara a viewDidAppear en el controller de la vista del contenedor. Asegurarme de que ya se había llamado a viewDidAppear (o postergar la adición del VC secundario hasta que lo fuera) lo resolví por mí.