Swift 从后台返回时更新标签
当应用程序从后台返回时,我在尝试更新标签时遇到问题。我已经为我的计时器应用程序实现了LocalNotifications,并且工作正常,但是当我返回应用程序时,倒计时标签停止。 因此,我基本上是想找到一种方法,用当前剩余时间更新倒计时标签。我将感谢任何帮助 我的代码在这里:Swift 从后台返回时更新标签,swift,xcode,uilabel,Swift,Xcode,Uilabel,当应用程序从后台返回时,我在尝试更新标签时遇到问题。我已经为我的计时器应用程序实现了LocalNotifications,并且工作正常,但是当我返回应用程序时,倒计时标签停止。 因此,我基本上是想找到一种方法,用当前剩余时间更新倒计时标签。我将感谢任何帮助 我的代码在这里: var timer = Timer() var teas = Teas() var isTimerRunning = false var alarmSound = AVAudioPlayer(
var timer = Timer()
var teas = Teas()
var isTimerRunning = false
var alarmSound = AVAudioPlayer()
var playing = false
var initialValueOfTime = 0
var timeDuration = 0
var currentBackgroundDate = Date()
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(teasGoBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(runTimer), name: UIApplication.didBecomeActiveNotification, object: nil)
}
@objc func runTimer() {
if isTimerRunning {
teas.time -= 1
let difference = Date().timeIntervalSince(self.currentBackgroundDate)
timeDuration = timeDuration + Int(difference)
if teas.time <= 0 {
timer.invalidate()
startButton.setTitle("Done", for: .normal)
}
}
else {
teas.time = initialValueOfTime
}
@objc func resetTimer() {
timer.invalidate()
runTimer()
}
@objc func teasGoBackground() {
timer.invalidate()
currentBackgroundDate = Date()
}
@IBAction func startButtonPressed(_ sender: Any) {
if !isTimerRunning {
navigationItem.hidesBackButton = true
isTimerRunning = true
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(runTimer), userInfo: nil, repeats: true)
print("time")
startButton.setTitle("Stop Brewing", for: .normal)
} else {
navigationItem.hidesBackButton = false
isTimerRunning = false
resetTimer()
startButton.setTitle("Start Brewing", for: .normal)
}
}
var timer=timer()
var teas=teas()
var isTimerRunning=false
var alarmSound=AVAudioPlayer()
var=false
var initialValueOfTime=0
var timeDuration=0
var currentBackgroundDate=日期()
覆盖函数视图将出现(uo动画:Bool){
超级。视图将显示(动画)
NotificationCenter.default.addObserver(self,选择器:#选择器(teasGoBackground),名称:UIApplication.didEnterBackgroundNotification,对象:nil)
NotificationCenter.default.addObserver(self,选择器:#选择器(运行计时器),名称:UIApplication.didBecomeActiveNotification,对象:nil)
}
@objc func运行计时器(){
如果你正在跑步{
茶时间-=1
让差异=日期().timeIntervalSince(self.currentBackgroundDate)
timeDuration=timeDuration+Int(差异)
如果teas.time您需要在viewDidLoad()
中添加您的观察者,则在viewdidappease中添加而不是
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(teasGoBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(runTimer), name: UIApplication.didBecomeActiveNotification, object: nil)
}
最后,我在我的项目中实现了这段代码并成功了
if let date = UserDefaults.standard.object(forKey: "teastart\(teas.id)") as? Date {
let now = Date()
let secondsTillNow = now.timeIntervalSince1970
let previousSeconds = date.timeIntervalSince1970
let timeSinceStart = secondsTillNow - previousSeconds
let time = Int(timeSinceStart)
if time > teas.time {
initialValueOfTime = teas.time
startButton.setTitle(NSLocalizedString("Start Brewing", comment: ""), for: .normal)
UserDefaults.standard.set(false, forKey: "timerunning\(teas.id)")
} else {
initialValueOfTime = teas.time - time
startButton.setTitle(NSLocalizedString("Stop Brewing", comment: ""), for: .normal)
UserDefaults.standard.set(true, forKey: "timerunning\(teas.id)")
}
} else {
initialValueOfTime = teas.time
UserDefaults.standard.set(false, forKey: "timerunning\(teas.id)")
}
您需要在viewDidLoad()中添加观察者
事件,而不是在视图中出现。这将是相同的,因为当我返回应用程序时,倒计时标签停止,所以基本上我需要找到方法从用户离开后的第二秒开始更新标签并恢复倒计时。知道如何实现吗?当应用程序进入backg时,以用户默认值节省时间取整,然后在用户默认值中保存另一个时间,当应用程序返回前台时,减去重新打开的时间(前台时间)从后台开始。你将有一段时间它停留在后台。现在,当它进入后台时,将这段时间添加到计数器中。你能分享一个小例子吗?我是一个非常新的开发人员,仍在与之抗争…非常感谢!非常感谢!