当应用程序获取 "Killed" 时尝试将我的计时器保存到 UserDefaults
Trying to Save My Timer to UserDefaults When The App Gets "Killed"
这是一个计时器应用程序,我希望计时器在应用程序被终止时暂停,当您重新打开应用程序时,我希望计时器显示最后已知的时间。
我已经为要保存的数据设置了一个结构。
let defaults = UserDefaults.standard
private enum TimeData {
static let allCurrentTime = "allCurrentTime"
}
override func viewDidLoad() {
super.viewDidLoad()
checkForSavedTimer()
marksSavedData()
theTimer.text = "00:00:00"
theTimer.font = UIFont(name: "Menlo-BoldItalic", size: 40)
marksTableView.isHidden = false
}
//I set the timer info to the struct (see below)
@objc func updateTimerLabel() {
seconds += 1
if seconds == 60 {
minutes += 1
seconds = 0
}else if minutes == 60 {
hours += 1
minutes = 0
}
timerString = "\(hours):\(minutes):\(seconds)"
theTimer.text = timerString
defaults.set(theTimer.text, forKey: TimeData.allCurrentTime)
}
// I then created a function which I called in the viewdidload above
func checkForSavedTimer() {
let allCurrentTime = defaults.value(forKey: TimeData.allCurrentTime) as? String ?? ""
theTimer.text = allCurrentTime
}
我认为这会将字符串从 theTimer 中保存到 UserDefaults,然后在 viewDidLoad 中将其取出并保存到 "theTimer.text" 但结果是 00:00:00
当您调用 checkForSavedTimer()
函数时,它可能从 UserDefaults
获取正确的值,但随后您将定时器文本设置回 00:00:00
两行之后。如果 UserDefaults
的值是 nil
,您将需要删除该行并在 checkForSavedTimer()
函数中添加一些逻辑以将值设置为 00:00:00
override func viewDidLoad() {
super.viewDidLoad()
checkForSavedTimer()
marksSavedData()
// Remove this -> theTimer.text = "00:00:00"
theTimer.font = UIFont(name: "Menlo-BoldItalic", size: 40)
marksTableView.isHidden = false
}
func checkForSavedTimer() {
// Set the timer text to the value from UserDefaults or "00:00:00" if the value is nil
theTimer.text = defaults.string(forKey: TimeData.allCurrentTime) ?? "00:00:00"
}
此外,最好使用 .string(forKey:)
从 UserDefaults
获取 String
,因为该值已经为您键入,因此您不需要添加 as? String
这是一个计时器应用程序,我希望计时器在应用程序被终止时暂停,当您重新打开应用程序时,我希望计时器显示最后已知的时间。
我已经为要保存的数据设置了一个结构。
let defaults = UserDefaults.standard
private enum TimeData {
static let allCurrentTime = "allCurrentTime"
}
override func viewDidLoad() {
super.viewDidLoad()
checkForSavedTimer()
marksSavedData()
theTimer.text = "00:00:00"
theTimer.font = UIFont(name: "Menlo-BoldItalic", size: 40)
marksTableView.isHidden = false
}
//I set the timer info to the struct (see below)
@objc func updateTimerLabel() {
seconds += 1
if seconds == 60 {
minutes += 1
seconds = 0
}else if minutes == 60 {
hours += 1
minutes = 0
}
timerString = "\(hours):\(minutes):\(seconds)"
theTimer.text = timerString
defaults.set(theTimer.text, forKey: TimeData.allCurrentTime)
}
// I then created a function which I called in the viewdidload above
func checkForSavedTimer() {
let allCurrentTime = defaults.value(forKey: TimeData.allCurrentTime) as? String ?? ""
theTimer.text = allCurrentTime
}
我认为这会将字符串从 theTimer 中保存到 UserDefaults,然后在 viewDidLoad 中将其取出并保存到 "theTimer.text" 但结果是 00:00:00
当您调用 checkForSavedTimer()
函数时,它可能从 UserDefaults
获取正确的值,但随后您将定时器文本设置回 00:00:00
两行之后。如果 UserDefaults
的值是 nil
checkForSavedTimer()
函数中添加一些逻辑以将值设置为 00:00:00
override func viewDidLoad() {
super.viewDidLoad()
checkForSavedTimer()
marksSavedData()
// Remove this -> theTimer.text = "00:00:00"
theTimer.font = UIFont(name: "Menlo-BoldItalic", size: 40)
marksTableView.isHidden = false
}
func checkForSavedTimer() {
// Set the timer text to the value from UserDefaults or "00:00:00" if the value is nil
theTimer.text = defaults.string(forKey: TimeData.allCurrentTime) ?? "00:00:00"
}
此外,最好使用 .string(forKey:)
从 UserDefaults
获取 String
,因为该值已经为您键入,因此您不需要添加 as? String