值使用UserDefaults互相替换

时间:2017-09-24 09:48:44

标签: ios swift xcode8 userdefaults

我有一个应用程序,我自己计时,看看我需要多长时间才能完成一堆问题。我有时间转移到另一个VC并显示在标签中。我通过按下按钮存储它但是当我有一个新变量(时间)时它会替换它。如何存储值数组并且可以在标签中显示?

保存值的按钮:

@IBAction func saveScore(_ sender: Any) {
    scoreLabel.text = label.text
    UserDefaults.standard.set(scoreLabel.text, forKey: "score")
}

永久保存数据的代码:

override func viewDidAppear(_ animated: Bool) {
    if let x = UserDefaults.standard.object(forKey: "score") as? String {
        scoreLabel.text = x
    }
}

我的得分标签显示我的所有分数,标签显示你刚刚得到的时间。

2 个答案:

答案 0 :(得分:0)

使用UserDefaults上的以下扩展来存储一系列次数:

extension UserDefaults {
    var times: [String] {
        get {
            if let times = UserDefaults.standard.object(forKey: "times") as? [String] {
                return times
            } else {
                return []
            }
        }
        set {
            UserDefaults.standard.set(newValue, forKey: "times")
        }
    }
}

虽然您不需要扩展UserDefaults,但使用扩展可以简化使用持久值的操作,并使代码更清晰。

然后在显示数据的位置,使用以下行访问数组:

let arrayOfTimes = UserDefaults.standard.times
scoreLabel.text = "\(arrayOfTimes)" // or any other formatting you'd like

而不是设置持续新分数的时间,只需将新分数添加到数组中,例如:

// This will not only add the scoreLabel.text to the array, but also persists it
UserDefaults.standard.times.append(scoreLabel.text)

答案 1 :(得分:0)

在Swift 4中,

将数组保存到用户默认值,您可以执行以下操作:

 let defaults = UserDefaults.standard

 let array = [25, 50]

 defaults.set(array, forKey: "Scores")

从用户默认值访问数组:

 let defaults = UserDefaults.standard

 let retrievedArray = defaults.array(forKey: "Scores") as? [Int] ?? []

如果您要在标签中显示数组的分数,那么您只需:

 scoreLabel.text = String(describing: retrievedArray[0])
  

如果您使用整数作为评分系统,我会建议您   将您的分数存储为用户默认值中的Int

如果您更喜欢使用Strings,请注意您可以直接使用用户默认值'stringArray(forKey:)方法,而不是array(forKey:)方法,因此,在这种情况下,您不需要输入你的数组:

let someStringArray = defaults.stringArray(forKey: "ArrayOfStrings")

注意:要回答您的问题,我会考虑您使用的是Int分数,但可以随意使用您喜欢的分数。

如果您希望在每次获得新分数时将用户默认值中的数组存储到相同的密钥 ,您可以像这样轻松地执行此操作:

let defaults = UserDefaults.standard

// Your new score:

let newScore = 75

// Get your current scores list from User Defaults:

var currentArray = defaults.array(forKey: "Scores") as? [Int] ?? []

// Append your new score to the current array:              

let updatedArray = currentArray.append(newScore)

// And save your updated array to User Defaults:

defaults.set(updatedArray, forKey: "Scores")

// In this example, your User Defaults now contains the updated array [25, 50, 75]

就是这样:)。

请注意,无需使用扩展程序..

更新另外,如果您想在viewDidAppear方法中添加内容,请不要忘记添加super.viewDidAppear(animated)viewDidLoad等也是如此。

documentation州:

  

您可以覆盖此方法以执行其他相关任务   与呈现视图。如果覆盖此方法,则必须调用   超级在你的实施中的某个时刻。

所以你会:

override func viewDidAppear(_ animated: Bool) {
   super.viewDidAppear(animated)

    if let retrievedArray = defaults.array(forKey: "Scores") as? [Int] {

        print(retrievedArray)

        // You can access your scores array safely here
    }
}