记得在swift中2个ViewControllers的高分

Remember the high score in 2 ViewControllers in swift

我得到了 2 ViewController 秒,在第一个中,用户获得了分数和高分标签。 在第二个 ViewController 中,代码计算用户是否打破了旧的高分,如果是 - 它当然会改变。但!当我退出应用程序并重新开始游戏时,高分标签显示我的 最后得分 而不是最高得分。 这是我的代码:

第一个ViewController:

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

defaults.synchronize()
highScore.text = String(stringInterpolationSegment: oldScore)

第二个ViewController:

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
if score > oldScore {
    defaults.setInteger(score, forKey: "oldScore")
    defaults.synchronize()
    var money = defaults.valueForKey("oldScore") as! Int
    oldScore = money
} else {
    defaults.setInteger(oldScore, forKey: "oldScore")
    defaults.synchronize()
    var money = defaults.valueForKey("oldScore") as! Int
    oldScore = money
}

我在视图控制器代码中也得到了 var oldScore = Int(),但在视图控制器的 class 之外。

此外,我还有一个 "Switch" 按钮,其状态为 "ON"。但是有时候me/the用户想把它改成关闭,退出应用重启后如何保存为用户选择?

在您的第一个视图控制器中进行以下更改。

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
if defaults.integerForKey("oldScore") != nil
{
   highScore.text = defaults.integerForKey("oldScore")
}
else
{
   highScore.text = 0
}

根据 highScore 的变量类型,可能需要进行一些更改。 希望这可能会有所帮助。

首先检查是否设置了 NSUserDefault for oldScore。如果未设置,则只初始化 oldScore,否则不初始化。只需获取 oldScore 的值并将其与新分数进行比较并相应地设置值

if (NSUserDefaults.standardUserDefaults().objectForKey(oldScore) == nil) {
    oldScore = Int()
}

在你的 Second View Controller 中,首先将 NSUserDefault's oldScore 的值放入一个变量中,然后检查它是否等于你的 Score。如果只是这样设置它:

let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
var oldScoreCheck = defaults.valueForKey("oldScore") as! Int
if score > oldScoreCheck {
   defaults.setInteger(score, forKey: "oldScore")
    defaults.synchronize()
}

根据 Apple 的文档,您应该在使用它们之前注册所有默认值。

  • application:didFinishLaunchingWithOptions: 的 AppDelegate 中添加此代码以注册密钥 oldScore 以获得可靠的默认值。还为提到的 "Switch" 按钮注册了密钥 switchState

    let defaults = NSUserDefaults.standardUserDefaults()
    let defaultValues = ["oldScore" : 0, "switchState" : "ON"]
    defaults.registerDefaults(defaultValues)
    
  • 在第一个视图控制器中检索高分值。如果没有值被写入磁盘,则采用注册的默认值 (0)。您可以分别读取 "Switch" 按钮的值。

    let defaults = NSUserDefaults.standardUserDefaults()
    let oldScore = defaults.integerForKey("oldScore")
    let buttonState = defaults.stringForKey("switchState")
    highScore.text = "\(oldScore)"
    
  • 如果改变了,在第二个视图控制器中保存高分

    let defaults = NSUserDefaults.standardUserDefaults()
    let oldScore = defaults.integerForKey("oldScore")
    if score > oldScore {
      defaults.setInteger(score, forKey: "oldScore")
      defaults.synchronize()
      oldScore = score
    }