web-dev-qa-db-fra.com

Quel est le meilleur moyen de détecter le moment où l'application entre en arrière-plan pour ma vue?

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?

62
jfisk

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

}
153
Jesse Black

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

}
21
Ashok R

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

9
Damien

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.

6
Luke

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

2
juanjo

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
}
0
thexande

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

0
smparkes

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. 

0
ingconti