ios - 高分标签未更新 - UserDefaults 和 Swift 4

标签 ios swift nsuserdefaults

我从中获取此代码的资源是用 Swift 3 编写的并且可以正常工作。我的应用程序是用 Swift 4 编写的。我认为我可能缺少 Swift 4 特有的东西,但我不知道它可能是什么。

我有合适的 channel 和变量......

@IBOutlet weak var scoreLabel: UILabel!
@IBOutlet weak var highScoreLabel1: UILabel!

var recordData: String!

viewDidLoadviewDidAppear 占...

override func viewDidLoad() {
    super.viewDidLoad()

    let userDefaults = Foundation.UserDefaults.standard
    let value = userDefaults.string(forKey: "Record")
    recordData = value

}

override func viewWillAppear(_ animated: Bool) {
    let userDefaults = Foundation.UserDefaults.standard
    let value = userDefaults.string(forKey: "Record")

    if (value == nil) {
        highScoreLabel1.text = "0"

    } else {

        highScoreLabel1.text = value
    }
}

我创建了一个我认为可以工作的函数...

func high score () {

    if gameMode == 0 {

        if recordData == nil {

            let savedString = scoreLabel.text
            let userDefaults = Foundation.UserDefaults.standard
            userDefaults.set(savedString, forKey: "Record")

        } else {

            let score: Int? = Int(scoreLabel.text!)
            let record: Int? = Int(recordData)

            if score! > record! {

                let savedString = scoreLabel.text
                let userDefaults = Foundation.UserDefaults.standard
                userDefaults.set(savedString, forKey: "Record")

            }
        }
    }
}

最佳答案

高分标签不会更新,因为没有代码。标签仅在 viewDidLoad/viewWillAppear 中设置(一次)。

我强烈建议将高分保存为Int。这避免了 optional ,并且可以显着减少代码。

  • 声明recordData

    var recordData = 0
    
  • 删除viewDidLoad中的代码。在 viewWillAppear 中加载一次数据就足够了。

  • viewWillAppear 替换为

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // integer(forKey returns 0 if the key is not used yet
        highScoreLabel1.text = String(UserDefaults.standard.integer(forKey: "Record"))
    }
    
  • 将最高分替换为

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

关于ios - 高分标签未更新 - UserDefaults 和 Swift 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54332944/

相关文章:

ios - 如何允许我的 Xcode 源代码编辑器扩展使用 XPC?

ios - 如何使用 SKShapenode 创建墙?

ios - NSUserDefaults 中的数据在每次应用程序重新启动时都会消失

ios - 有没有更好的方法将此调用写入大量 NSUserDefault BOOLS?

objective-c - 终端无法识别更新的用户默认值

ios - 如何显示模拟器日志?在 IOS 12.0 和 Xcode 10 中?

ios - 附近使用 Swift 3.0 的蓝牙设备

iphone - 使用 CALayer 的 UIView 不显示阴影

ios - 将文本对齐到 TableView 中单元格左上角的简单方法?

ios - 如何在 swift 中使用文本字段文本 "Amount"向表格 View 添加额外的行