【问题标题】:UserDefaults is NOT keeping data saved after app is closed and re-openedUserDefaults 不会在应用程序关闭并重新打开后保存数据
【发布时间】:2019-02-24 00:06:41
【问题描述】:

我目前遇到的一个问题是,如果我离开应用程序并返回,recordData 值不会保持保存状态。如果我在不关闭应用程序的情况下再次玩游戏,它确实会保持保存状态。

如果我关闭并重新打开应用程序,ant new score 将替换 recordData,因此,将 highScoreLabel1.text 更新为新的 score。即使新的score 的值小于先前保存的recordData 值,也会发生这种情况。请注意,highScoreLabel1.text 会在重新打开应用程序时显示正确的高分。在制作任何新的score 后,它就不会保留它。所以,基本上它似乎UserDefaults 仅在应用程序打开时工作,并且在应用程序关闭并重新打开后不会持续存在。我可能需要AppDelegate 的东西。有什么建议吗?

这是我的highScoreUserDefaults 代码:

var recordData = 0

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    highScoreLabel1A.text = String(UserDefaults.standard.integer(forKey: "Record1A"))
}

func highScore() {
    guard gameMode == 0, let score = Int(scoreLabel.text!), score > recordData else { return }
    recordData = score
    UserDefaults.standard.set(recordData, forKey: "Record1A")
    highScoreLabel1B.text = String(recordData)
}

【问题讨论】:

  • 当您启动应用程序时,似乎 recordData 将始终为 0。因此,任何分数都会更高,并将写入 UserDefaults。

标签: swift userdefaults


【解决方案1】:

只需在viewWillAppear 中添加一行,即可将recordData 设置为之前保存的高分...

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // high score code
    highScoreLabel1A.text = String(UserDefaults.standard.integer(forKey: "Record1A"))

    // This code will set recordData to the previously saved High Score value, thus avoiding "0"
    recordData = UserDefaults.standard.integer(forKey: "Record1A")

} 

【讨论】:

    【解决方案2】:

    UserDefaults 保留数据,但您只设置文本标签而不设置变量recordData

    viewWillAppear 替换为

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    
        recordData = UserDefaults.standard.integer(forKey: "Record1A")
        highScoreLabel1A.text = String(recordData)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 2022-06-10
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多