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

时间:2019-01-23 17:49:21

标签: ios swift nsuserdefaults

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

我有适当的店铺和变量...

@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")

            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

保存时使用以下代码

DispatchQueue.main.async {
  userDefaults.set(savedString, forKey: "Record")
}

答案 1 :(得分:0)

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

我强烈建议将高分另存为Int。这样就避免了可选内容,并且可以大幅减少代码

  • 声明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)
    }