2009-05-21 5 views
7

Mise à jourviewDidLoad est appelée, ne viewWillAppear pas appelée, vue ne semble pas à l'écran

Il a été mentionné que viewWillAppear et viewDidAppear ne sont pas appelés par les docs. Toutefois, je n'effectue aucune initialisation dans ces méthodes et aucune ajout d'éléments d'interface utilisateur à la vue.

Je viens de les utiliser pour placer des points de pause pour essayer de déboguer cela.

D'autres idées?


Original Question

Je suis perplexe. Je refactorisation du code et ont rencontré un comportement étrange ....

J'initialize viewController A sans nib et définir la vue d'un programme.

viewDidLoad dans le contrôleur A est appelé.

intérieur viewDidLoad de viewController A, I B viewController initialiser à partir d'une plume.

-je ajouter viewControllerB.view comme sous-vue viewControllerA.view

viewDidLoad du contrôleur B est appelé.


Ensuite, il obtient bizarre:

  1. viewWillAppear et viewDidAppear de viewController B jamais get appelé.

  2. viewControllerB.view jamais fait sur l'écran.

  3. Aucune erreur.


choses que je vérifié:

Le nom du viewControllerBs Nib est correcte.

La prise de vue de viewControllerB est reliée à une vue.

viewControllerB et son point de vue à la fois ne sont pas nuls.

Et pour couronner le tout, tout fonctionne très bien dans SDK [expurgée] 5 beta!

Des idées? Il faut que ce soit quelque chose de stupide ..

+0

Donc cela fonctionne sur sdk3 mais pas sur les précédents? – EightyEight

+0

Voir la réponse de Ramin sur le mystère viewWillAppear. C'est dans les docs, mais ce n'est pas facile à trouver. Vous ne savez pas pourquoi viewControllerB ne parvient jamais à l'écran. Est-ce que vous faites une initialisation importante dans viewWillApeear? – amattn

+0

+1 pour la liste des choses vérifiées avant de poser la question ici – stefanB

Répondre

0

Pour fermer la question:

Je ne pourrais jamais trouver une solution, mais depuis SDK 3.0 est la norme et le point est devenue sans objet. Le code fonctionne correctement dans les versions actuelles du SDK.

19

Si le contrôleur d'affichage est ajouté à une hiérarchie de vue par le code, le contrôleur de vue ne se viewWillAppear messages (ou viewDidAppear).Si vous l'ajoutez vous-même, vous devez envoyer le message au contrôleur de vue.

+2

merci, cela m'aide à comprendre pourquoi les viewWillAppears/didAppears ne sont pas appelés. Cependant, le problème persiste –

1

Essayez

-(void) viewDidAppear:(BOOL)animated { 
// whatever 
} 
+0

ceci est appelé après que la vue est chargée .. –

3

Ne pas oublier d'appeler

[super viewWillAppear:animated]; 

Où que vous redéfinissez.

La documentation dit:

Si vous remplacez cette méthode, vous devez appeler super à un moment donné dans votre mise en œuvre.

+0

J'utilise un storyboard avec les contrôleurs de nav/viewcontrollers et viewDidAppear n'était pas appelé ... la raison était que j'avais commenté [super viewDidAppear: animé] de ma sous-classe personnalisée dont un de mes viewControllers a hérité. Doh! Aucune idée de pourquoi je l'ai fait à l'origine (je pense à résoudre une condition de course.) Le fait de décommander cela a résolu le problème! Merci pour le rappel! – taber

0

Je suppose que votre vue n'est pas la vue racine. Vous utilisez probablement un UINavigationController essayer donc de mettre en œuvre cette méthode

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 

ou celui

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 

et ajoutez dans votre viewDidLoad

this.navController.delegate = self; 

(ne pas oublier d'ajouter le UINavigationControllerDelegate protocole dans votre fichier .h