Swift Nsuserdefaults高分保存

Swift Nsuserdefaults高分保存,swift,nsuserdefaults,Swift,Nsuserdefaults,当我按下“tapPressed”按钮,score++,然后它保存为highscore,问题是当我重新启动应用程序时,我保存了highscore。当我按下“tapPressed”时,highscore再次从零开始。将viewDidLoad更改为: var score = 0 var highscore = 0 var defaults = NSUserDefaults.standardUserDefaults() @IBOutlet weak var scoreResult: UILabel!

当我按下“tapPressed”按钮,score++,然后它保存为highscore,问题是当我重新启动应用程序时,我保存了highscore。当我按下“tapPressed”时,highscore再次从零开始。

将viewDidLoad更改为:

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

应用程序启动后,将从默认值加载高分。

在您的
视图中加载
您需要将语句更改为:

override func viewDidLoad() {
    super.viewDidLoad()

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

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

建议的方法是注册键/值对,使其具有可靠的默认值,以防首选项文件被删除或应用程序第一次启动

在AppDelegate(
ApplicationIDFinishLaunching
或更早版本)中,使用值0注册
highscore

if let hscore = defaults.valueForKey("highscore") {
    highscore = hscore
    highScoreResult.text = String(hscore)
}
然后在
viewDidLoad
中只需编写

let defaultValues = ["highscore" : 0]
defaults.registerDefaults(defaultValues)
不需要可选绑定,因为用户默认值中的值始终是非可选的

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

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

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

一起使用。在viewDidLoad中读取用户默认值时,您没有设置
highscore
,因此每次加载视图控制器时它都将为零。谢谢,您能告诉我,我应该在viewDidLoad中添加什么?使用valueForKey设置或从用户默认值中获取值根本不是一个好方法,而是使用实际类型,如stringForKey、Boolforky、intForKey等。
defaults.setInteger(highscore, forKey: "highscore")