UIViewController viewWillAppear n'est pas appelé lors de l'ajout en tant que sous-vue
J'ai un UIViewController
que je suis le chargement à partir de l'intérieur d'un autre point de vue contrôleur, puis en ajoutant son point de vue à un UIScrollView
.
self.statisticsController = [self.storyboard instantiateViewControllerWithIdentifier:@"StatisticsViewController"];
self.statisticsController.match = self.match;
[self.scrollView addSubview:self.statisticsController.view];
J'ai mis des points d'arrêt dans la vue statistiques de contrôleur et viewDidLoad
est appelé, mais viewWillAppear
ne l'est pas.
Est-ce parce que je ne suis pas en le poussant sur la hiérarchie ou quelque chose?
source d'informationauteur Fogmeister
Vous devez vous connecter pour publier un commentaire.
Vous devez ajouter
statisticsController
comme un enfant-vue-contrôleur le contrôleur dont le point de vue que vous êtes en train d'ajouter.Je ne suis pas sûr que cela va faire
viewDidAppear
appelés, mais vous pouvez remplacerdidMoveToParentViewController:
dans le contrôleur enfant, et qui seront appelés, de sorte que vous pouvez mettre n'importe quel code que vous avez mis enviewDidAppear
.Je rencontre
-viewWillAppear:
pas appelé problème de nouveau. Après recherche sur google, je suis venu ici. J'ai fait quelques tests, et de savoir que l'appel afin de-addSubview
et-addChildViewController:
est important.Cas 1. va déclencher
-viewWillAppear:
de contrôleur, mais Cas 2, il NE appel-viewWillAppear:
.Cas 1:
Cas 2:
Par défaut, l'apparence rappels sont automatiquement transmis aux enfants.
Il est déterminé avec shouldAutomaticallyForwardAppearancemethods de la propriété. Vérifier la valeur de ce propery, si c'est NON et si votre enfant viewController doit apparaître à droite sur le récipient, l'apparence, vous devez en informer l'enfant avec les méthodes suivantes dans le récipient du contrôleur de cycle de vie mise en œuvre:
Personnalisation de l'Apparence et de la Rotation de Rappel Comportement
Fixe mon problème! Espérons qu'il serait utile.
Comme mentionné dans une autre réponse, la vue parent contrôleur peut pas appeler
viewWillAppear
etc. lorsqueshouldAutomaticallyForwardAppearanceMethods
est fixé àfalse
.UINavigationController
etUITabBarController
sont connues pour le faire. Dans ce cas, vous devez appelerbeginAppearanceTransition(_ isAppearing: Bool, animated: Bool)
sur l'enfant-vue-contrôleur avecisAppearing
ensemble detrue
lorsque la vue s'affiche et vice versa.Vous devez placer ces appels à des endroits appropriés dans votre code, normalement, lorsque vous ajouter et supprimer votre enfant-vue-contrôleur.
N'oubliez pas d'appeler
endAppearanceTransition
sur votre enfant-vue-contrôleur lors de votre personnalisé de transition a pris fin, sinonviewDidAppear
etviewDidDisappear
ne sont pas appelés.Par Apple (https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html), l'ordre correct des appels API pour ajouter un enfant de-vue-contrôleur est:
Mais j'ai toujours eu le problème où viewWillAppear de l'enfant VC n'a pas été sporadiquement appelé. Mon problème est qu'il y a une condition de concurrence qui pourrait provoquer le code ci-dessus pour obtenir exécuté avant viewDidAppear dans le conteneur view controller a été appelé. Veiller à ce que viewDidAppear avait déjà été appelé (ou de reporter l'ajout de l'enfant VC jusqu'à ce qu'il était) résolu pour moi.
Les réponses précédentes sont correctes, mais dans le cas où il aide à quelqu'un - si vous remplacez
loadView
de l'enfant-vue-contrôleur, alors aucun des autres UIViewController méthodes appelées.M'a fallu un certain temps pour comprendre pourquoi mon code ne fonctionnait pas correctement, jusqu'à ce que j'ai réalisé que j'avais accidentellement substituée
loadView
au lieu deviewDidLoad
.Dans mon cas, j'ai trouvé que, à tort, reprit une
viewWillAppear:
méthode dans ma baseUINavigationController
classe:Note, qu'au lieu d'appeler
super.viewWillAppear(animated)
j'ai écritsuper.viewWillDisappear(animated)
.Qui a causé tous
UIViewController
's qui étaient à l'intérieur de cetteUINavigationController
n'ont pas été appelantviewWillAppear:
méthode.Espère que ça aide quelqu'un sur un sujet similaire.