Szybki
Krótka odpowiedź
Użyj NotificationCenter
raczej obserwatora niż 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
}
Długa odpowiedź
Aby dowiedzieć się, kiedy aplikacja wraca z tła, użyj NotificationCenter
obserwatora zamiast viewWillAppear
. Oto przykładowy projekt, który pokazuje, które zdarzenia mają miejsce, kiedy. (Jest to adaptacja tej odpowiedzi na Cel 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")
}
}
Przy pierwszym uruchomieniu aplikacji kolejność wyjściowa to:
view did load
view will appear
did become active
view did appear
Po naciśnięciu przycisku Home, a następnie przeniesieniu aplikacji z powrotem na pierwszy plan, kolejność wyjściowa jest następująca:
will enter foreground
did become active
Więc jeśli były pierwotnie próbuje użyć viewWillAppear
wtedy UIApplication.willEnterForegroundNotification
jest chyba to, co chcesz.
Uwaga
Począwszy od iOS 9 i nowszych, nie musisz usuwać obserwatora. W dokumentacji czytamy:
Jeśli aplikacja jest przeznaczona na iOS 9.0 i nowsze lub macOS 10.11 i nowsze, nie musisz wyrejestrowywać obserwatora w tej dealloc
metodzie.
applicationWillEnterForeground:
aby określić, kiedy aplikacja ponownie weszła w stan aktywny.