Nsuserdefaults 保存高分

Nsuserdefaults highscore saving

var score = 0
var highscore = 0
var defaults = NSUserDefaults.standardUserDefaults()

@IBOutlet weak var scoreResult: UILabel!
@IBOutlet weak var highScoreResult: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    if let hscore = defaults.valueForKey("highscore") {
        highScoreResult.text = String(hscore)
    }
}

@IBAction func tapPressed(sender: AnyObject) {
    score++
    scoreResult.text = String(score)
   if score > highscore {
    highscore = score
        highScoreResult.text = String(highscore)
        defaults.setValue(highscore, forKey: "highscore")
        defaults.synchronize()
    }
}

当我按下 "tapPressed" 按钮时,得分++,然后它保存为高分,问题是当我重新启动应用程序时我已经保存了高分。当我按下 "tapPressed" 时,高分再次从零开始。

将 viewDidLoad 更改为:

override func viewDidLoad() {
    super.viewDidLoad()

    if let hscore = defaults.valueForKey("highscore") {
        highscore = hscore
        highScoreResult.text = String(hscore)
    }
}

应用启动后,应该会从默认值加载高分。

在您的 viewDidLoad 中,您需要将声明更改为:

if let hscore = defaults.valueForKey("highscore") {
    highscore = hscore
    highScoreResult.text = String(hscore)
}

其他答案描述了错误的原因。此外,我还想描述如何正确使用 NSUserDefaults

推荐的方法是注册 key/value 对以获得可靠的默认值,以防首选项文件将被删除或应用程序首次启动。

在 AppDelegate(applicationDidFinishLaunching 或更早版本)中注册 highscore,值为 0。

let defaultValues = ["highscore" : 0]
defaults.registerDefaults(defaultValues)

然后在viewDidLoad中写

let highscore = defaults.integerForKey("highscore") 
highScoreResult.text = String(highscore)

不需要可选绑定,因为用户默认值中的值始终是非可选的。

要将 highscore 保存回磁盘,请使用专用方法 setInteger:forKey:

defaults.setInteger(highscore, forKey: "highscore")

valueForKey:是一种具有特殊含义的KVC方法,不应该与NSUserDefaults.

一起使用