【问题标题】:NSUserDefaults not simply saving high scoreNSUserDefaults 不仅仅是保存高分
【发布时间】:2015-11-10 18:37:29
【问题描述】:

它应该是当我的玩家达到一个新的高分时,它会在 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")

}

有什么遗漏吗?如有必要,将发布更多代码。

【问题讨论】:

    标签: swift sprite-kit nsuserdefaults


    【解决方案1】:

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

    您正在保存为 "highScoreLabel"

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

    但尝试读取为 "highScore"

    highScore = defaults.integerForKey("highScore")
    

    读写NSUserDefaults时应该使用相同的键

    供将来参考...

    我个人在处理键时设置了静态变量。所以你以后再也不会遇到这种麻烦了。

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

    然后使用

    highScore = defaults.integerForKey(Defaults.HighScore)
    

    问题是没有更改任何变量,代码替换为:

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

    【讨论】:

    • 由于某种原因,最后一行不想使用静态常量。
    • 尽管我改变了一切,但实际上并没有解决任何问题。
    • 我确实是从头顶写的,但我刚刚测试过,一切正常,你自己试试吧:NSUserDefaults.standardUserDefaults().setInteger(1, forKey: Defaults.HighScore) NSUserDefaults.standardUserDefaults().synchronize() print(NSUserDefaults.standardUserDefaults().integerForKey(Defaults.HighScore))
    • 在再次查看您的代码后也进行了更新 - 请查看我的答案
    • 好的,非常感谢。它仍然很奇怪,没有做任何事情,但我想我可以自己尝试解决。
    猜你喜欢
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    相关资源
    最近更新 更多