2010-12-14 5 views
6

Dans iOS4.2/iPhone4Comment savoir quand une vue UIViewController est affichée après avoir été en arrière-plan?

  • Cliquez sur l'icône pour lancer l'application (certains vue vue des contrôleurs est affiché)
  • Cliquez sur le bouton iPhone Accueil (retour à écran d'accueil)
  • double-cliquez sur le bouton Accueil
  • Sélectionnez précédemment lancé l'application de la sélection

maintenant, je peux voir que mon application delegate reçoit un message "applicationDidBecomeActive" lorsqu'il est sélectionné après la dernière étape, mais comment est-ce que mon viewController (celui qui est actuellement affiché) le sait? ViewDidLoad a déjà été appelé, il n'est donc pas appelé à nouveau. viewWillLoad n'est pas appelé à nouveau.

Impossible de comprendre. Raison que je demande est que je veux vérifier pour voir si des modifications de paramètres ont été faites, mais je voudrais le faire dans le contrôleur de vue parce que c'est la chose qui se soucie.

Répondre

5

en vous êtes appDelegate applicationDidBecomeActive mis ceci:

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    UINavigationController *navc = (UINavigationController *)[tabBarController selectedViewController]; 

    UIViewController *topvc = [navc topViewController]; 

    if ([topvc respondsToSelector:@selector(viewControllerDidBecomeActive)]) 
    { 
     [topvc performSelector:@selector(viewControllerDidBecomeActive)]; 
    } 
} 

Cela devient le viewController qui est vu à l'écran. Vous devez juste implémenter viewControllerDidBecomeActive sur chaque viewControllers;)

+0

Bon, ce genre de travail, mais pas exactement ce que je cherchais. Ma hiérarchie de vue est un peu plus complexe, donc votre code posté ne fonctionnera pas tel quel, mais j'ai l'idée et je pourrais le faire de cette façon. Donc, c'est définitivement une façon de faire. J'espérais que j'aurais manqué quelque chose et qu'il y avait un moyen plus direct et indépendant de la hiérarchie du contrôleur de vue. – Fraggle

+0

Plusieurs années plus tard maintenant, mais AFAICS la meilleure option serait d'utiliser NSNotificationCenter. –

0

Dans l'application appDelegateDidBecomeActive, définissez une propriété booléenne qui vient d'apparaître en arrière-plan.

Ensuite, dans votre viewcontroller, en particulier dans le override viewDidAppear, vérifiez la propriété appDelegate, si elle est vraie, alors vous savez qu'elle vient de l'arrière-plan, sinon elle est apparue comme normale. BTW Ensuite, définissez la propriété boolean sur false pour la netteté.

EDIT- Vous devez appeler viewDidAppear manuellement dans ApplicationDidBecomeActive sauf si vous avez recréé votre pile de navigation. Si vous pouviez obtenir un pointeur sur le contrôleur de vue visible actuel, l'appel de viewDidAppear devrait être une approche sans problème car tous les contrôleurs de vue ont cette méthode. Vous avez pas besoin de délégués ou etc.

+0

Eh bien non, ça ne marche pas. La vue est déjà apparue. Puis quelqu'un va et modifie certains paramètres, puis ils retournent dans l'application. Typiquement sur iOS 4 de toute façon, viewDidAppear ne sera plus appelé, n'est-ce pas? – Fraggle

+0

Ah désolé votre droit! J'ai oublié dans mes applications que je fais des choses à la pile de navigation dans applicationDidBecomeActive.Si vous avez un pointeur vers votre contrôleur de vue visible actuel, vous pouvez simplement appeler une fonction dans votre vue en lui disant de vérifier si quelque chose a changé, mais c'est essentiellement la même chose que la réponse de Thomas, mais sans l'élégance des délégués. – Rob

Questions connexes