Метка рекорда не обновляется - UserDefaults и Swift 4 - PullRequest
0 голосов
/ 23 января 2019

Ресурс, с которого я получил этот код, был написан на Swift 3 и работает соответствующим образом. Мое приложение написано на Swift 4. Я думаю, что мне может не хватать чего-то специфического для Swift 4, но я не могу понять, что это может быть.

У меня есть соответствующие выходы и переменная ...

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

var recordData: String!

viewDidLoad и viewDidAppear учитываются ...

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 голосов
/ 24 января 2019

Метка рекорда не обновляется, потому что нет кода. Метка устанавливается только (один раз) в 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)
    }
    
0 голосов
/ 23 января 2019

Используйте следующий код при сохранении

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