swift 倒计时器未运行

zzoitvuj  于 2022-10-31  发布在  Swift
关注(0)|答案(1)|浏览(208)

从后台返回时代码未运行。如果我暂停应用程序,将其完全关闭并重新打开,则计算时间会非常精确。如何在用户离开应用程序并返回时使其运行?

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))
}
3htmauhk

3htmauhk1#

您需要添加代码来侦听挂起和恢复事件。(UIApplication.willResignActiveNotification和UIApplication. didBecomeActiveNotification)。
当你收到通知说你要放弃成为活动应用程序时,你需要保存剩余的时间(或已用的时间)。
你不知道你的应用会被恢复还是被终止,所以你需要将信息保存到UserDefaults,然后在处理didBecomeActiveNotification或你的应用再次启动时提取它。如果你的应用被移到后台,然后又被移到前台而没有被终止,你的viewDidAppear方法将不会被调用,因为你的视图控制器的视图从未离开屏幕。

相关问题