Использование пользовательских настроек по умолчанию для хранения данных, переданных из другого View Controller - PullRequest
0 голосов
/ 20 сентября 2018

Я сохраняю целое число с помощью пользовательских настроек по умолчанию, но число, которое я пытаюсь сохранить, было передано с помощью segue (ageFromSettings) и должно иметь значение по умолчанию.

Проблема в том, что данные, которые были переданы с помощью segue, сохраняются при представлении, но при перезапуске приложения сохраняют значение по умолчанию.

Любые идеи, как сохранить элемент, который был передан черезSegue?

class ViewController: UIViewController {   

    @IBOutlet weak var youHaveLabel: UILabel!
    @IBOutlet weak var daysLeftLabel: UILabel!
    @IBOutlet weak var leftToLiveLabel: UILabel!
    @IBAction func settingsButtonPressed(_ sender: Any) {
       performSegue(withIdentifier: "toSettings", sender: nil)
    }


    var daysLeft = 0

    var ageFromSettings = 36500


    override func viewDidAppear(_ animated: Bool) {

        UserDefaults.standard.set(ageFromSettings, forKey: "persistedAge")


        if let age = UserDefaults.standard.object(forKey: "persistedAge") as? Int{
            print("age: \(age)")
            daysLeft = age
        }

        if daysLeft == 36500 {
            daysLeftLabel.alpha = 0
            youHaveLabel.alpha = 0
            leftToLiveLabel.text = "Set your age in Settings"
        } else if daysLeft == -1{
            leftToLiveLabel.text = "Day On Borrowed Time"
        } else if daysLeft == 0{
            leftToLiveLabel.text = "Statistically, you died today"
        } else if daysLeft == 1{
            leftToLiveLabel.text = "Day Left to Live"
        } else if daysLeft < 0 {
            leftToLiveLabel.text = "Days on Borrowed Time"
        }

        if daysLeft > -1 {
            daysLeftLabel.text = String(daysLeft)
        } else {
            daysLeftLabel.text = String(daysLeft * -1)
        }

    }

}

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

В вашем случае вы устанавливаете значение клавиши persistedAge каждый раз в методе viewDidAppear(_:) вашего контроллера представления.Сразу после этого вы извлекаете данные и пытаетесь их прочитать, что несколько избыточно.В последнем случае вы также будете сбрасывать значение клавиши persistedAge каждый раз, когда появляется ваш контроллер вида.

0 голосов
/ 20 сентября 2018

Проблема в том, что вы говорите:

UserDefaults.standard.set(ageFromSettings, forKey: "persistedAge")
if let age = UserDefaults.standard.object(forKey: "persistedAge") as? Int{

Это псих.Во второй строке мы знаем , что UserDefaults содержит ключ persistedAge, и мы знаем его значение - потому что вы просто поместили его там, в первой строке.И вы делаете это, даже если у вас уже установлено другое значение persistedAge при предыдущем запуске приложения.

Удалите первую строку.Если ваша цель - указать начальное значение по умолчанию, используйте register(defaults:_).Вот для чего это.Он будет использоваться только в том случае, если у вас есть , а не , который называется set(_:forKey:).

...