NSUserDefaults 不仅仅是保存高分

NSUserDefaults not simply saving high score

它应该是当我的玩家达到新的高分时,它会在 GameOver 场景中显示,但在这种情况下,它并没有这样做。我的所有 NSUserDefaults 都在单独的 .swift 文件中。

这是我的代码:

import Foundation

class GameState {

    var score: Int
    var highScore: Int
    var stars: Int

    class var sharedInstance :GameState {
        struct Singleton {
            static let instance = GameState()
        }

        return Singleton.instance
    }

    init() {
        // Init
        score = 0
        highScore = 0
        stars = 0

        // Load game state
        let defaults = NSUserDefaults.standardUserDefaults()

        highScore = defaults.integerForKey("highScore")
        stars = defaults.integerForKey("stars")
    }

    func saveState() {
        // Update highScore if the current score is greater
        highScore = max(score, highScore)

        // Store in user defaults

        let defaults = NSUserDefaults.standardUserDefaults()
        defaults.setInteger(highScore, forKey: "highScoreLabel")
        defaults.setInteger(stars, forKey: "stars")
        NSUserDefaults.standardUserDefaults().synchronize()
    }

}

在我的 GameOver 场景中,我将所有文本标签设置如下:

     lblHighScore.text = String(format: "High Score: %d", GameState.sharedInstance.highScore)

在我的 GameScene 中,我有它,所以它 应该 在游戏结束时同步:

   func endGame() {
    gameOver = true


    GameState.sharedInstance.saveState() //right here
    print("saved score")
    let reveal = SKTransition.fadeWithDuration(0.5)
    let gameScene = GameOver(size: self.scene!.size)
    view!.presentScene(gameScene, transition: reveal)

    print("new scene")

}

是不是少了什么?如有必要,将 post 更多代码。

您可能忽略了编码中的一个问题:

您正在保存为 "highScoreLabel"

let defaults = NSUserDefaults.standardUserDefaults()
defaults.setInteger(highScore, forKey: "highScoreLabel")
defaults.setInteger(stars, forKey: "stars")
defaults.synchronize()

但试图读作 "highScore"

highScore = defaults.integerForKey("highScore")

读取和写入 NSUserDefaults

时应使用相同的密钥

供将来参考...

我个人在处理键时设置静态 let 变量。这样你以后就再也不会来打嗝了

struct Defaults {
    static let HighScore = "highScore"
    static let Stars     = "stars"
}

然后使用

highScore = defaults.integerForKey(Defaults.HighScore)

问题是 none 个变量被更改,代码替换为:

class GameState {

    var highScore: Int
    var stars: Int

    class var sharedInstance :GameState {
        struct Singleton {
            static let instance = GameState()
        }

        return Singleton.instance
    }

    init() {
        // Load game state
        highScore   = NSUserDefaults.standardUserDefaults().integerForKey(Defaults.HighScore) ?? 0
        stars       = NSUserDefaults.standardUserDefaults().integerForKey(Defaults.Stars) ?? 0
    }

    func saveState(score: Int) {
        // Update highScore if the current score is greater
        highScore = max(score, highScore)

        // Store in user defaults
        NSUserDefaults.standardUserDefaults().setInteger(highScore, forKey: Defaults.HighScore)
        NSUserDefaults.standardUserDefaults().setInteger(stars,     forKey: Defaults.Stars)
        NSUserDefaults.standardUserDefaults().synchronize()
    }

}