Ios 使用UserDefaults相互替换的值
我有一个应用程序,我给自己计时,看看完成一大堆问题需要多长时间。我将时间转移到另一个VC并显示在标签中。我通过按下一个按钮来存储它,但当我有一个新变量(时间)时,它会替换它。如何存储可在标签中显示的值和值数组 保存值的按钮: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"
@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}