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
Swift 我尝试使用UserDefaults,使分数不会在每次打开时重置为零,但它不会';行不通_Swift_Nsuserdefaults - Fatal编程技术网

Swift 我尝试使用UserDefaults,使分数不会在每次打开时重置为零,但它不会';行不通

Swift 我尝试使用UserDefaults,使分数不会在每次打开时重置为零,但它不会';行不通,swift,nsuserdefaults,Swift,Nsuserdefaults,我正在尝试在我的游戏中创建应用内货币系统。为此,我尝试使用UserDefaults,以便在每次关闭应用程序并重新打开或切换到其他viewController并切换回时,不会将上述货币重置为零。然而,它似乎不起作用。有人能告诉我我做错了什么吗 这是我的密码: var notesScore = 0 @IBAction func IncreaseNotes(_ sender: UIButton) { notesScore = notesScore + 1 notesLabel.tex

我正在尝试在我的游戏中创建应用内货币系统。为此,我尝试使用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类,在该类中存储所有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。我希望这有帮助。请随意将其标记为正确的解决方案!:)如果我不想让它成为类的一部分,那该怎么办?你是说全局访问,还是说现在在类中如何访问?通常,您必须在类内调用它才能对其执行某些操作?