从后台返回时代码未运行。如果我暂停应用程序,将其完全关闭并重新打开,则计算时间会非常精确。如何在用户离开应用程序并返回时使其运行?
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if let lastTimerStartTime = UserDefaults.standard.value(forKey: "lastTimerStartTime") as? Date,
let totalTime = UserDefaults.standard.value(forKey: "totalTime") as? Double {
let timeSinceStartTime = Date() - lastTimerStartTime
if timeSinceStartTime < totalTime {
seconds = totalTime - timeSinceStartTime
runTimer()
} else {
timeLabel.text = timeString(time: TimeInterval(seconds))
}
} else {
timeLabel.text = timeString(time: TimeInterval(seconds))
}
}
@IBAction func startBtn(_ sender: Any) {
runTimer()
}
func runTimer() {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(ViewController.updateTimer)), userInfo: nil, repeats: true)
UserDefaults.standard.set(Date(), forKey: "lastTimerStartTime")
UserDefaults.standard.set(seconds, forKey: "totalTime")
}
@objc func updateTimer(){
seconds -= 1
timeLabel.text = timeString(time: TimeInterval(seconds))
}
1条答案
按热度按时间3htmauhk1#
您需要添加代码来侦听挂起和恢复事件。(UIApplication.willResignActiveNotification和UIApplication. didBecomeActiveNotification)。
当你收到通知说你要放弃成为活动应用程序时,你需要保存剩余的时间(或已用的时间)。
你不知道你的应用会被恢复还是被终止,所以你需要将信息保存到UserDefaults,然后在处理didBecomeActiveNotification或你的应用再次启动时提取它。如果你的应用被移到后台,然后又被移到前台而没有被终止,你的viewDidAppear方法将不会被调用,因为你的视图控制器的视图从未离开屏幕。