Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用UserDefaults相互替换的值_Ios_Swift_Xcode8_Userdefaults - Fatal编程技术网

Ios 使用UserDefaults相互替换的值

Ios 使用UserDefaults相互替换的值,ios,swift,xcode8,userdefaults,Ios,Swift,Xcode8,Userdefaults,我有一个应用程序,我给自己计时,看看完成一大堆问题需要多长时间。我将时间转移到另一个VC并显示在标签中。我通过按下一个按钮来存储它,但当我有一个新变量(时间)时,它会替换它。如何存储可在标签中显示的值和值数组 保存值的按钮: @IBAction func saveScore(_ sender: Any) { scoreLabel.text = label.text UserDefaults.standard.set(scoreLabel.text, forKey: "score"

我有一个应用程序,我给自己计时,看看完成一大堆问题需要多长时间。我将时间转移到另一个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
    }
}

My scoreLabel显示我的所有分数,label显示你刚得到的时间。

使用
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)

在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:)
方法,因此,在这种情况下,您不需要键入cast-your-array:

let someStringArray = defaults.stringArray(forKey: "ArrayOfStrings")
注:为了回答你的问题,我会考虑你使用的是分数,但是可以随意使用你喜欢的任何一种。 如果每次获得新分数时,都希望将数组存储到用户默认值中的同一个键上,可以这样轻松地执行:

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]
就这样:)

请注意,不需要为此使用扩展

更新:另外,如果您想在
viewdideappease
方法中添加内容,请不要忘记添加
super.viewdideappease(动画)
。这同样适用于
viewDidLoad

各国:

您可以重写此方法以执行关联的其他任务 提出观点。如果重写此方法,则必须调用 在您的实现中的某个点上是超级的

所以你会:

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
    }
}

我不确定我应该把这个代码放在哪里。我应该为我的save score按钮和我的userDefaults代码在视图中显示哪些代码。我已经把代码放在了我认为应该放的地方,但它现在不起作用。顺便说一下,我使用的是字符串,但我应该使用整数吗。谢谢你!如果你的分数在你的应用程序中代表一个整数,那么你最好将其保存为整数。事实上,这样做更有意义。当然,您仍然可以使用字符串(description:)在标签中显示您的分数,就像我在回答中显示的一样。您应该将此代码放在@iAction(save score)中,因为您希望在用户点击save score按钮时将新分数保存为用户默认值。:)不客气!如果您还有其他问题,请告诉我:)。谢谢Alex的帮助!感谢米兰的帮助,非常感谢!然而,当我完成游戏时,它显示的是“标签”,而不是标签上所说的内容,例如23.5秒,其他一切都很好,但这不是用户默认值的问题。。最可能的问题是何时设置标签的文本(以及何时将数据保存到UserDefaults)。检查您的代码,并尝试在可用时尽快将数据保存到UserDefaults,并在显示标签时尽快从UserDefaults刷新标签。最后,您甚至不必在viewController之间传递它,只需在到达末尾时添加值,并在带有标签的viewController中使用UserDefaultsOk的数据谢谢,我会让您知道我该怎么做谢谢!我需要向saveScore按钮添加UserDefaults.standard.times.append(down.text)。如果让x=UserDefaults.standard.object(forKey:“times”),则删除ViewDidDisplay中的所有内容并将其添加为?字符串{resultLabel.text=x}