首页 > 解决方案 > 使用用户默认值存储从另一个视图控制器传递的数据

问题描述

我正在使用用户默认值存储一个整数,但我尝试存储的数字是通过 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)
        }

    }

}

标签: swiftuserdefaultsdata-persistence

解决方案


问题是你在说:

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

这太疯狂了。在第二行中,我们知道UserDefaults 包含一个persistedAge键,并且我们知道它的值是什么——因为你只是把它放在那里,在第一行。即使您已经persistedAge在应用程序的先前运行中设置了不同的值,您也会这样做。

删除第一行。如果您的目标是提供初始默认值,请使用register(defaults:_). 这就是它的用途。只有在您还没有打电话的情况下才会使用它set(_:forKey:)


推荐阅读