80 votes

Quelle est la meilleure façon de détecter lorsque l'application entre en arrière-plan pour ma vue ?

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 ?

175voto

Maudicus Points 4513

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];

}

26voto

Ashok R Points 7671

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) {

}

10voto

Damien Points 1576

Sur vos applications AppDelegate la méthode (void)applicationDidEnterBackground:(UIApplication *)application sera appelée par iOS. Vous pouvez y arrêter votre minuteur.

8voto

Luke Points 3529

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.

2voto

user2027279 Points 373

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.com

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.

Powered by:

X