2010-11-28 26 views
3

J'ai un UITabBarController qui imbrique une UIView-Sous-classe (ImageViewer) comme son troisième onglet.Pourquoi viewDidAppear dans UITabBarController exec avant l'affichage de la vue?

Dans ce ImageViewer je Sous appeler la méthode viewDidAppear:

- (void) viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    /* ... start custom code ... 
    NSLog(@"viewDidAppear tag 1 passed);   /* BREAKPOINT 1 here 

    [myUIActivityIndicator stopAnimating]; 

    NSLog(@"viewDidAppear tag 2 passed);   /* BREAKPOINT 2 here 
    /* ... end custom code ... 
} 

la méthode est appelée automatiquement, mais étrangement la vue apparaît seulement après cette méthode a été traitée complètement?

Lorsque je règle les points d'arrêt (1 et 2) comme indiqué, le traitement (lors de la sélection de l'onglet) s'arrête alors que l'onglet précédent est toujours affiché. Ce n'est qu'en cliquant sur continuer après le deuxième point d'arrêt que la vue sera affichée. (Pour info les NSLogs sont réalisées immeldiately).

Dans ce cas viewDidAppear se comporte plus comme viewWillAppear ....

Tous les indices de ce qui pourrait se passer?

Vive

+0

Appellez-vous vraiment la méthode comme vous le suggérez? – blindjesse

+0

Non, la méthode est appelée automatiquement après la sélection de l'onglet 3. – iFloh

+0

On dirait que le système n'a tout simplement pas trouvé le temps de redessiner l'écran pour le moment. C'est probablement pourquoi vous ne voyez rien. – JustSid

Répondre

11

Si vous souhaitez autoriser l'écran à redessiner lorsque vos charges de vue, mais pour déclencher un autre code de mise à jour à -viewDidAppear:, utilisez performSelector:withObject:afterDelay: comme ceci:

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [self performSelector:@selector(updateUI) withObject:nil afterDelay:0.0]; 
} 

… 

- (void)updateUI 
{ 
    // Do your UI stuff here 
} 

Lorsque vous le faites de cette façon, la boucle d'événement en cours se terminera rapidement, et UIKit sera capable de redessiner l'écran après le chargement de votre vue. updateUI sera appelée dans la boucle d'événement suivante. C'est un bon moyen d'obtenir des transitions de vue accrochantes si vous devez effectuer des calculs intensifs ou des mises à jour après le chargement d'une vue.

+0

Bonne réponse. En outre, viewDidAppear fonctionne dans iOS5. – bentford

1

à partir du son, si vous appelez activement la méthode, l'appareil pourrait ne pas avoir le temps pour afficher réellement la vue en cours d'exécution le « code personnalisé » dans votre méthode viewDidAppear. Dans ce cas, vous devriez laisser le programme appeler la méthode viewDidAppear elle-même.

Votre programme peut également travailler sur un autre code qui ralentirait l'apparence de la vue, ceci peut être résolu en utilisant des minuteurs. à-dire au lieu de:

[self otherCode]; 

vous écririez:

[NSTimer scheduledTimerWithTimeInterval:.5 
    target:self 
    selector:@selector(otherCode) 
    userInfo:nil 
    repeats:NO]; 

vous pourriez vouloir essayer de retarder simplement votre « code personnalisé » avec une minuterie de cette façon.

+0

Super, merci. Cela me permet de contourner le symptôme. Je vais laisser ce fil ouvert pour savoir s'il y a un remède à la cause première ... Je cours l'application sur un iPod touch de première génération qui semble planter juste à cause de ça ... – iFloh