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?
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 .
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
}
é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.
}
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() {
}
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)
}