J'ai un contrôleur de vue qui utilise un NSTimer
pour exécuter du code.
Quelle est la meilleure façon de détecter quand l'application passe en arrière-plan afin que je puisse mettre le chronomètre en pause ?
J'ai un contrôleur de vue qui utilise un NSTimer
pour exécuter du code.
Quelle est la meilleure façon de détecter quand l'application passe en arrière-plan afin que je puisse mettre le chronomètre en pause ?
Vous pouvez demander à n'importe quelle classe intéressée lorsque l'application passe en arrière-plan de recevoir des notifications. C'est une bonne alternative au couplage de ces classes avec AppDelegate.
Lors de l'initialisation desdites classes :
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillTerminate:) name:UIApplicationWillTerminateNotification object:nil];
Répondre aux notifications
-(void)appWillResignActive:(NSNotification*)note
{
}
-(void)appWillTerminate:(NSNotification*)note
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillResignActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillTerminateNotification object:nil];
}
Dans Swift 4.0
override func viewDidLoad() { super.viewDidLoad() let app = UIApplication.shared //Register for the applicationWillResignActive anywhere in your app. NotificationCenter.default.addObserver(self, selector: #selector(ViewController.applicationWillResignActive(notification:)), name: NSNotification.Name.UIApplicationWillResignActive, object: app) } @objc func applicationWillResignActive(notification: NSNotification) { }
Pour ceux qui cherchent à le faire dans Swift :
Sur init
:
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(applicationWillResignActive), name: UIApplicationWillResignActiveNotification, object: nil)
Sur deinit
:
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationWillResignActiveNotification, object: nil)
Réponse à la notification :
dynamic private func applicationWillResignActive() {
// Do things here
}
Apple nous encourage à éviter la répartition dynamique et les sélecteurs Objective-C dans la mesure du possible dans Swift, mais c'est toujours le moyen le plus pratique de le faire.
Dans Swift 4.1 :
J'utilise la version de fermeture :
var observer: NSObjectProtocol!
// inside init or viewDidLoad:
observer = NotificationCenter.default.addObserver(forName: .UIApplicationWillResignActive, object: nil, queue: nil) { _ in
print("willResignActive")
}
deinit {
NotificationCenter.default.removeObserver(observer)
}
La addObserver
renvoie un objet opaque qui doit être supprimé à un moment donné.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.