web-dev-qa-db-fra.com

Gestion de applicationDidBecomeActive - "Comment un contrôleur de vue peut-il réagir lorsque l'application devient active?"

J'ai le protocole UIApplicationDelegate dans ma classe principale AppDelegate.m, avec la méthode applicationDidBecomeActive définie.

Je souhaite appeler une méthode lorsque l'application revient de l'arrière-plan, mais qu'elle se trouve dans un autre contrôleur de vue. Comment puis-je vérifier quel contrôleur de vue est actuellement affiché dans la méthode applicationDidBecomeActive puis faire un appel à une méthode dans ce contrôleur?

168
Calvin

Toute classe de votre application peut devenir un "observateur" pour différentes notifications dans l'application. Lorsque vous créez (ou chargez) votre contrôleur de vue, vous souhaitez l'enregistrer en tant qu'observateur pour UIApplicationDidBecomeActiveNotification et spécifier la méthode à appeler lorsque cette notification est envoyée à votre application.

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

N'oubliez pas de nettoyer après vous-même! N'oubliez pas de vous retirer en tant qu'observateur lorsque votre vue s'en va:

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

Plus d'informations sur le Notification Center .

294
Reed Olsen

Swift 3, 4 Equivalent:

ajout d'observateur

NotificationCenter.default.addObserver(self,
    selector: #selector(applicationDidBecomeActive),
    name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for Swift 4.2+
    object: nil)

enlever l'observateur

NotificationCenter.default.removeObserver(self,
    name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for Swift 4.2+
    object: nil)

callback

@objc func applicationDidBecomeActive() {
    // handle event
}
57
igrek

équivalent de Swift 2:

let notificationCenter = NSNotificationCenter.defaultCenter()

// Add observer:
notificationCenter.addObserver(self,
  selector:Selector("applicationWillResignActiveNotification"),
  name:UIApplicationWillResignActiveNotification,
  object:nil)

// Remove observer:
notificationCenter.removeObserver(self,
  name:UIApplicationWillResignActiveNotification,
  object:nil)

// Remove all observer for all notifications:
notificationCenter.removeObserver(self)

// Callback:
func applicationWillResignActiveNotification() {
  // Handle application will resign notification event.
}
16
Zorayr

Swift 4.2

Ajouter un observateur

NotificationCenter.default.addObserver(self, selector: #selector(handleEvent), name: UIApplication.didBecomeActiveNotification, object: nil)

Supprimer l'observateur

NotificationCenter.default.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)

Poignée Event-

@objc func handleEvent() {
}
6
Abhishek Jain

Avec Swift 4, Apple conseille via un nouveau compilateur d'avertir d'éviter l'utilisation de #selector dans ce scénario. Voici un moyen beaucoup plus sûr d’y parvenir:

Commencez par créer une variable paresseuse pouvant être utilisée par la notification:

lazy var didBecomeActive: (Notification) -> Void = { [weak self] _ in
    // Do stuff
} 

Si vous souhaitez que la notification soit incluse, remplacez simplement le _ avec notification.

Ensuite, nous configurons la notification à observer pour que l’application devienne active.

func setupObserver() {
    _ = NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive,
                                               object: nil,
                                               queue:.main,
                                               using: didBecomeActive)
}

Le grand changement ici est qu’au lieu d’appeler un #selector, nous appelons maintenant la variable créée ci-dessus. Cela peut éliminer les situations où vous obtenez des plantages de sélecteurs incorrects.

Enfin, nous retirons l'observateur.

func removeObserver() {
    NotificationCenter.default.removeObserver(self, name: .UIApplicationDidBecomeActive, object: nil)
}
3
CodeBender