Swift 我尝试使用UserDefaults,使分数不会在每次打开时重置为零,但它不会';行不通
我正在尝试在我的游戏中创建应用内货币系统。为此,我尝试使用UserDefaults,以便在每次关闭应用程序并重新打开或切换到其他viewController并切换回时,不会将上述货币重置为零。然而,它似乎不起作用。有人能告诉我我做错了什么吗 这是我的密码:Swift 我尝试使用UserDefaults,使分数不会在每次打开时重置为零,但它不会';行不通,swift,nsuserdefaults,Swift,Nsuserdefaults,我正在尝试在我的游戏中创建应用内货币系统。为此,我尝试使用UserDefaults,以便在每次关闭应用程序并重新打开或切换到其他viewController并切换回时,不会将上述货币重置为零。然而,它似乎不起作用。有人能告诉我我做错了什么吗 这是我的密码: var notesScore = 0 @IBAction func IncreaseNotes(_ sender: UIButton) { notesScore = notesScore + 1 notesLabel.tex
var notesScore = 0
@IBAction func IncreaseNotes(_ sender: UIButton)
{
notesScore = notesScore + 1
notesLabel.text = String(notesScore)
}
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = colors.themeBlue
notesLabel.textColor = colors.white
var notesScoreDefault = UserDefaults.standard
if (notesScoreDefault.value(forKey: "notesScore") != nil)
{
notesScore = notesScoreDefault.value(forKey: "notesScore") as! NSInteger
notesLabel.text = NSString(format: "Notes: %i", notesScore) as String
}
更改分数时,应存储分数。例如,当您增加分数时,可以将其存储到
userdefaults
中
@IBAction func IncreaseNotes(_ sender: UIButton) {
notesScore = notesScore + 1
notesLabel.text = String(notesScore)
// Saving score.
UserDefaults.standard.set(self.notesScore, forKey: "notesScore")
}
现在在viewDidLoad
中,您可以按如下方式检索该分数
let score = UserDefaults.standard.integer(forKey: "notesScore")
notesLabel.text = String(score)
因此,我通常建议您编写一个UserdefaultsHelper.swift类,在该类中存储所有userdefaults并可以跟踪 例如,它应该如下所示:
import UIKit
import Foundation
class UserDefaultsHelper {
static var notesScore: Int? {
get {
return UserDefaults.standard.object(forKey: "notesScore") as? Int
}
set {
UserDefaults.standard.set(newValue, forKey: "notesScore")
}
}
}
if let existingNotesScore = UserDefaultsHelper.notesScore {
UserDefaultsHelper.notesScore = existingNotesScore + 5
}
之后,在应用程序中的任何位置,您只需拨打以下电话即可访问该值:
UserDefaultsHelper.notesScore
这是一个可选选项,因此下次您需要它时,甚至可能不确定它是否存在,您可以为exmaple调用viewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
if let notesScore = UserDefaultsHelper.notesScore {
// Do what you want with it here
}
}
然后添加一些东西或做你想做的事。例如,我存储用户ID或PushToken。对于未来的Userdefaults,您只需将其添加到UserdefaultsHelper.swift
编辑:示例
关于你在评论中的问题。如果你想增加5。您可以这样做:
import UIKit
import Foundation
class UserDefaultsHelper {
static var notesScore: Int? {
get {
return UserDefaults.standard.object(forKey: "notesScore") as? Int
}
set {
UserDefaults.standard.set(newValue, forKey: "notesScore")
}
}
}
if let existingNotesScore = UserDefaultsHelper.notesScore {
UserDefaultsHelper.notesScore = existingNotesScore + 5
}
说明:使用“if-let”,您可以安全地检查变量notescore中的Userdefaults中是否保存了某些内容,如果是,它将进入{}中,您可以访问existingnotescore中的值。然后您只需使用现有的+5覆盖Userdefaults中的值,您在哪里尝试将分数保存到
Userdefaults
?不要使用value(forKey:)
。请查看有关UserDefaults的文档,并使用适当的方法从UserDefaults获取数据。@rmaddy NotesCoreDefault。我做错了吗?问题是你什么都不做。您没有尝试将最新的分数保存到UserDefaults。@rmaddy我该如何解决这个问题?太好了。谢谢你,伙计!现在可以了!如果我想以同样的方式在另一个视图控制器中显示它,只需要一个问题。我该怎么做?你可以使用let score=UserDefaults.standard.integer(forKey:“notescore”)
在应用程序的任何地方获得分数值,而无需在后台队列中更新UserDefaults
。@rmaddy在非常频繁地设置某个内容时,它会阻塞主线程,但在正常使用情况下看起来不错。在后台保存和在主线程中检索之间的不一致可能是一个问题。如果您想在这里了解更多信息,有一个很好的关于DispatchQueue的教程:如何使用UserDefaults将分数设置为递增5?@AlexTănăsescu我用一个代码示例编辑了我的答案,如何将其递增5。我希望这有帮助。请随意将其标记为正确的解决方案!:)如果我不想让它成为类的一部分,那该怎么办?你是说全局访问,还是说现在在类中如何访问?通常,您必须在类内调用它才能对其执行某些操作?