当应用程序获取 "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