我正在创建一个应用,其中用户设置了计时器。当应用程序进入后台时,timer.invalidate()
。现在,我希望计时器在应用程序回到前台时再次启动。当应用程序发送通知应用程序在前台时,我正在创建计时器的另一个实例。但是,它没有触发该功能。
我在Viewdidload()
中创建一个计时器:
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(handleCountdown), userInfo: nil, repeats: true)
RunLoop.current.add(self.timer!, forMode: RunLoop.Mode.common)
然后我收到通知,以检查该应用程序是在后台还是在前台:
当它进入后台时,我使timer
无效。
@objc func applicationDidEnterBackground() {
let defaults = UserDefaults.standard
let quitTime = Date()
defaults.set(quitTime, forKey: "quitTimeKey") //Storing the time of quit in UserDefaults
timer?.invalidate()
}
应用退出后,我首先检查timer
是否为isValid,然后创建一个新计时器。但是此计时器似乎不起作用。
@objc func appEntersForeground() {
calculateTimeLeft()
if let timer = timer {
if (!timer.isValid)
{
Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(handleCountdown), userInfo: nil, repeats: true)
}
}
}
这里的一些帮助将不胜感激!
答案 0 :(得分:1)
将您的timer
属性声明为weak
:
weak var timer: Timer?
然后,当nil
无效时,它将被设置为timer
。然后,只需在创建新的timer
之前检查nil
是否为@objc func appEntersForeground() {
calculateTimeLeft()
if timer == nil {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(handleCountdown), userInfo: nil, repeats: true)
}
}
:
{{1}}