J'ai un contrôleur de vue qui utilise une NSTimer
pour exécuter du code.
Quel est le meilleur moyen de détecter le moment où l'application passe en arrière-plan afin de pouvoir suspendre le chronomètre?
Vous pouvez avoir n'importe quelle classe intéressée lorsque l'application passe en arrière-plan 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) {
}
Sur vos applications, AppDelegate, la méthode (void)applicationDidEnterBackground:(UIApplication *)application
sera appelée par iOS. Vous pouvez arrêter votre chronomètre ici.
Pour ceux qui cherchent à le faire à Swift:
Sur init
:
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(applicationWillResignActive), name: UIApplicationWillResignActiveNotification, object: nil)
Sur deinit
:
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationWillResignActiveNotification, object: nil)
En 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 cela reste 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 méthode addObserver
renvoie un objet opaque qui doit être supprimé à un moment donné.
Swift 4:
init() {
NotificationCenter.default.addObserver(self,
selector: #selector(applicationWillResignActive),
name: NSNotification.Name.UIApplicationWillResignActive,
object: nil)
}
deinit {
NotificationCenter.default.removeObserver(self,
name: NSNotification.Name.UIApplicationWillResignActive,
object: nil)
}
@objc private func applicationWillResignActive() {
self.header.blur.effect = nil
}
- (void)applicationWillResignActive:(UIApplication *)application
sur le délégué de votre application. Vous pouvez également vous inscrire à la notification UIApplicationWillResignActiveNotification
sur d'autres objets.
Cependant, vous n'avez pas nécessairement besoin de suspendre le chronomètre. Si vous ne faites rien, l'application sera de toute façon mise en veille et n'exécutera aucun code. Vraisemblablement, votre chronomètre se déclenchera lorsque vous redevenez actif (si vous le faites). Si vous devez faire quelque chose de spécial, il existe des méthodes de délégation et des notifications 'devenues actives' auxquelles vous pouvez vous inscrire également.
note seulement latérale: Si vous enregistrez un contrôleur A pour être averti en arrière-plan, veillez à ce qu’il soit appelé même si vous (par exemple ..) poussez un deuxième contrôleur B et que Vous affichez B: Si ce comportement n’est pas correct, il est préférable d’enregistrer/désinscrire dans
didAppear/WillDisappear.