Попытка сохранить мой таймер в UserDefaults, когда приложение получает "Убит" - PullRequest
0 голосов
/ 23 июня 2019

Это приложение таймера, и я хотел бы, чтобы таймер сделал паузу, когда приложение будет убито, и когда вы снова откроете приложение, я бы хотел, чтобы таймер отображал последнее известное время.

Я установил структуру для данных, которые будут сохранены.

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

1 Ответ

1 голос
/ 23 июня 2019

Когда вы вызываете функцию checkForSavedTimer(), она, вероятно, получает правильное значение из UserDefaults, но затем вы устанавливаете текст таймера обратно на 00:00:00 двумя строками позже. Вам нужно будет удалить эту строку и добавить некоторую логику в функцию checkForSavedTimer(), чтобы установить значение 00:00:00, если значение из UserDefaults равно nil

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:), чтобы получить String от UserDefaults, потому что тогда значение уже введено для вас, и поэтому вам не нужно добавлять as? String

...