我尝试使用 UserDefaults 使分数不会在每次打开时重置为零,但它不起作用



我正试图在我的游戏中创建一个应用内货币系统。为了做到这一点,我尝试使用UserDefaults,以便每次关闭应用程序并重新打开或切换到不同的viewController并切换回来时,所述货币不会重置为零。然而,它似乎不起作用。有人能告诉我我做错了什么吗?

这是我的代码:

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类,在其中存储所有用户默认值并可以跟踪。

例如,它应该看起来像这样:

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

之后,在你的应用程序中的任何地方,你都可以通过调用来访问该值

UserDefaultsHelper.notesScore

这是一个可选选项,所以下次你需要它时,甚至可能不确定它是否存在,你可以调用exmaple:的viewDidLoad

override func viewDidLoad() {
super.viewDidLoad()
if let notesScore = UserDefaultsHelper.notesScore {
// Do what you want with it here
}
}

然后添加一些内容或做你想做的事。例如,我存储userID或pushToken。对于未来的Userdefaults,您可以将其添加到UserdefaultsHelper.swift

编辑:示例

关于您在评论中的问题。如果你想把它增加5。你可以这样做:

if let existingNotesScore = UserDefaultsHelper.notesScore {
UserDefaultsHelper.notesScore = existingNotesScore + 5
}

说明:使用"if let",您可以安全地检查变量notesCore中的Userdefaults中是否保存了某些内容,如果是,它将进入{}中,您可以访问现有NotesCore中的值。然后您只需用现有的+5 覆盖Userdefaults中的值

最新更新