Swift
Réponse courte
Utiliser un NotificationCenter
observateur plutôt que viewWillAppear
.
override func viewDidLoad() {
super.viewDidLoad()
// set observer for UIApplication.willEnterForegroundNotification
NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
}
// my selector that was defined above
@objc func willEnterForeground() {
// do stuff
}
Réponse longue
Pour savoir quand une application revient de l'arrière-plan, utilisez une fonction NotificationCenter
observateur plutôt que viewWillAppear
. Voici un exemple de projet qui montre quels événements se produisent à quel moment. (Il s'agit d'une adaptation de cette réponse en Objective-C .)
import UIKit
class ViewController: UIViewController {
// MARK: - Overrides
override func viewDidLoad() {
super.viewDidLoad()
print("view did load")
// add notification observers
NotificationCenter.default.addObserver(self, selector: #selector(didBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
}
override func viewWillAppear(_ animated: Bool) {
print("view will appear")
}
override func viewDidAppear(_ animated: Bool) {
print("view did appear")
}
// MARK: - Notification oberserver methods
@objc func didBecomeActive() {
print("did become active")
}
@objc func willEnterForeground() {
print("will enter foreground")
}
}
Au premier démarrage de l'application, l'ordre de sortie est le suivant :
view did load
view will appear
did become active
view did appear
Après avoir appuyé sur le bouton d'accueil et ramené l'application au premier plan, l'ordre de sortie est le suivant :
will enter foreground
did become active
Ainsi, si vous vouliez à l'origine utiliser viewWillAppear
puis UIApplication.willEnterForegroundNotification
est probablement ce que vous voulez.
Note
À partir d'iOS 9, il n'est plus nécessaire de supprimer l'observateur. L'observateur la documentation États :
Si votre application cible iOS 9.0 et les versions ultérieures ou macOS 10.11 et les versions ultérieures, vous n'avez pas besoin de désenregistrer un obus. vous n'avez pas besoin de désenregistrer un observateur dans son fichier dealloc
méthode.
1 votes
Vous devez utiliser
applicationWillEnterForeground:
pour déterminer quand votre application est revenue à l'état actif.0 votes
J'ai dit que c'est ce que j'essayais de faire dans ma question. Veuillez vous référer à ce qui précède. Pouvez-vous proposer un moyen de déterminer quel est le contrôleur de vue actuel à partir du délégué de l'application ?
0 votes
Vous pouvez utiliser
isMemberOfClass
oisKindOfClass
en fonction de vos besoins.0 votes
@sudo rm -rf Comment cela fonctionnerait-il alors ? Sur quoi va-t-il appeler isKindOfClass ?
0 votes
@occulus : Dieu sait que j'essayais juste de répondre à sa question. Il est certain que votre façon de faire est la meilleure.