迅速
简短的回答
使用NotificationCenter
观察者而不是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
}
长答案
要了解应用程序何时从后台返回,请使用NotificationCenter
观察者而不是viewWillAppear
. 这是一个示例项目,显示了哪些事件何时发生。(这是对这个 Objective-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")
}
}
首次启动应用程序时,输出顺序为:
view did load
view will appear
did become active
view did appear
按下主页按钮,然后将应用程序带回前台后,输出顺序为:
will enter foreground
did become active
因此,如果您最初尝试使用,viewWillAppear
那么UIApplication.willEnterForegroundNotification
可能就是您想要的。
笔记
从 iOS 9 及更高版本开始,您无需移除观察者。该文档指出:
如果您的应用面向 iOS 9.0 及更高版本或 macOS 10.11 及更高版本,则无需在其dealloc
方法中取消注册观察者。