使用用户默认值存储从另一个View Controller传递的数据

时间:2018-09-20 15:56:05

标签: swift userdefaults data-persistence

我正在使用“用户默认值”存储整数,但是我尝试存储的数字是通过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 :(得分:0)

问题是你在说:

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

那是坚果。在第二行中,我们知道,UserDefaults包含一个persistedAge键,我们知道它的值-因为您只需将它放在第一行中即可。即使您已经已经在上次运行的应用程序上设置了不同的persistedAge值,也可以这样做。

删除第一行。如果您的目标是提供初始默认值,请使用register(defaults:_)。那就是它的目的。仅在您还没有叫set(_:forKey:)的情况下使用它。

答案 1 :(得分:0)

在您的情况下,您需要在视图控制器的persistedAge方法中设置viewDidAppear(_:)键的值每次。此后,您正在检索数据并尝试读取它,这有些多余。在后一种情况下,每次您的视图控制器出现时,您还将重置persistedAge键的值。