Comment indiquer au controller de vue active lorsque applicationDidBecomeActive est appelée?

Je sens qu'il me manque un truc ici …

Je veux juste appeler viewDidLoad ou viewDidAppear sur le controller de vue active en cours quand applicationDidBecomeActive est appelé, ainsi je peux réinitialiser certaines animations ou autre, quand l'application est redémarrée de l'arrière-plan. Certains de mes points de vue s'en fichent, mais d'autres ont vraiment besoin de savoir.

J'utilise Storyboards et mon file de délégué d'application a les fonctions standard – mais tous avec des corps vides. Par exemple, didFinishLaunchingWithOptions renvoie simplement YES et ne fait rien d'autre. Storyboard fait automagiquement tout ce que je suppose.

Alors, comment puis-je parler au controller de vue en cours à partir de mon délégué d'application plutôt vide et sans informations?

Je reorderais d'utiliser des notifications.

Dans la méthode applicationdidBecomeActive de votre délégué d'application, placez ce code:

[[NSNotificationCenter defaultCenter] postNotificationName:@"appDidBecomeActive" object:nil]; 

Dans votre vue active active, la méthode init du controller s'abonne à la notification.

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateStuff) name:@"appDidBecomeActive" object:nil]; 

Implémentez la méthode "updateStuff" dans votre controller et vous devriez être capable de faire ce que vous voulez quand l'application devient active.

Au lieu d'envoyer une notification de votre délégué d'application, le operating system envoie automatiquement une notification que vous pouvez observer:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(initSongInfo) name:UIApplicationDidBecomeActiveNotification object:nil]; 

Et bien sûr, assurez-vous d'arrêter d'observer avant ou à l'intérieur de votre méthode dealloc, en appelant:

 [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil]; 

Version rapide:

Vous pouvez append cette ligne dans votre vueDidLoad

 NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(viewDidBecomeActive), name: UIApplicationDidBecomeActiveNotification, object: nil) func viewDidBecomeActive(){ print("viewDidBecomeActive") } 

Plutôt que d'essayer de garder une trace de quel ViewController est en cours, vous pouvez envoyer un NSNotification à partir de votre AppDelegate et vous y abonner dans votre ViewController. De cette façon, le controller de vue garde la trace de viewDidAppear.

votre AppDelegate aura une propriété window, cette window aura une propriété rootViewController. Vous pouvez find votre viewController ici.

Si vous utilisez un TabBarController, le rootviewcontroller sera le tabbarcontroller, et vous pouvez appeler le ViewController sélectionné par tabbarcontroller pour get le viewController en cours.

 UIViewController *rootViewController = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; if ([rootViewController isKindOfClass:[UITabBarController Class]]) rootViewController = ((UITabBarController *)rootViewController).selectedViewController; else if ([rootViewController isKindOfClass:[UINavigationController Class]]) rootViewController = ((UINavigationController *)rootViewController).topViewController; [rootViewController viewDidAppear]; 

Si vous disposez d'une hiérarchie de vue plus complexe avec des controllers de navigation ou des vues modales, vous pouvez faire appel à presentedViewController ou à topViewController.