J'ai le UIApplicationDelegate
protocole dans ma classe principale AppDelegate.m, avec la applicationDidBecomeActive
méthode définie.
Je veux appeler une méthode lorsque l'application revient de l'arrière-plan, mais la méthode est dans un autre contrôleur de vue. Comment puis-je vérifier quel contrôleur de vue est actuellement affiché dans la applicationDidBecomeActive
méthode, puis appeler une méthode dans ce contrôleur?
NSNotificationCenter
. Je vous remercie!Swift 3, 4 équivalent:
ajout d'observateur
suppression d'observateur
rappeler
la source
viewDidLoad
ouviewWillAppear:animated
par exemple. Et vous pouvez supprimer un observateur lorsque vous n'avez plus besoin de notifications, ou lorsque votre instance d'observateur va être désallouée dans la méthodeÉquivalent Swift 2 :
la source
removeObserver
Swift:deinit
méthode.Swift 4.2
Ajouter un observateur
Supprimer l'observateur
Gérer l'événement
la source
Avec Swift 4, Apple conseille via un nouvel avertissement du compilateur que nous évitons d'utiliser
#selector
dans ce scénario. Voici un moyen beaucoup plus sûr d'accomplir cela:Tout d'abord, créez une var paresseuse qui peut être utilisée par la notification:
Si vous souhaitez que la notification réelle soit incluse, remplacez simplement le
_
parnotification
.Ensuite, nous configurons la notification pour observer l'activation de l'application.
Le grand changement ici est qu'au lieu d'appeler a
#selector
, nous appelons maintenant le var créé ci-dessus. Cela peut éliminer les situations dans lesquelles vous obtenez des plantages de sélecteurs non valides.Enfin, nous supprimons l'observateur.
la source
#selector
peut appeler une méthode déclarée comme@objc
attribut dans Swift 4.removeObserver(self
car self n'a pas été attribué lors de l'ajout d'observateur. Vous devriezlet observer = NotificationCenter.default.addObserver
alorsremoveObserver(observer
@objc
. Cependant, lorsque je l'essaye, j'obtiens un avertissement dans la console (Xcode 11.3.1 (11C504), Swift 13.3): Impossible de terminer BackgroundTask: aucune tâche d'arrière-plan n'existe avec l'identifiant. Même si je sauvegarde l'observateur dans une variable sous NSObjectProtocol.@objc
variante.Swift 5
la source
La manière de combiner:
la source