Я не могу добавить счет с NSUserDefaults

-2

Я пытаюсь создать приложение для викторины, и я хочу добавить самый высокий балл, но когда я нажимаю на правильную кнопку ответа, coinLabel имеет Matcoin = 10. Затем я снова Matcoin = 20 на правильную кнопку ответа, и у нее должен быть текст Matcoin = 20 но вместо этого есть Matcoin = 10. Это не добавляет счет.

вот мой код:

var coin = 0
func addCoin() {

    if soruSayisi >= 1 && soruSayisi <= 12 {
        //if the number of questions is between 1 and 12
        coin = coin + 10

    else {
        print("error")
    }

    UserDefaults.standard.set(coin, forKey: "coin")
    UserDefaults.standard.synchronize()

    coinLabel.text = NSString(format: "Matcoin =  %i", coin) as String

}
@IBAction func AbuttonClicked(_ sender: Any) {

    if "A" == cvpLbl {

        addCoin()
        //correct answer
    }


override func viewWillAppear(_ animated: Bool) {

    let coinString = String(UserDefaults.standard.integer(forKey: "coin"))
    coinLabel.text = "Matcoin = \(coinString)"
}
  • 0
    У вас есть эта ошибка при закрытии и повторном открытии приложения? Если это так, то это потому, что вы не берете содержимое UserDefaults и не сохраняете его в переменной coin при запуске. В viewWillAppear вы можете написать что-то вроде coin = UserDefaults.standard.integer(forKey: "coin") coinLabel.text = "Matcoin = \(coin)" . Таким образом, при запуске переменная coin всегда будет содержать значение, которое вы сохранили в UserDefaults.
  • 0
    у меня нет никаких ошибок при закрытии и повторном открытии приложения. и я написал этот код в viewWillappear вы можете увидеть ниже кодов.
Показать ещё 1 комментарий
Теги:
nsuserdefaults

3 ответа

1
Лучший ответ

Причина заключается в том, что при вызове addCoin() вы не читаете значение монеты из userDefaults

func addCoin() {

    coin = UserDefaults.standard.integer(forKey: "coin")

    if soruSayisi >= 1 && soruSayisi <= 12 {

        coin = coin + 10

    else {

        print("error")
        return
    }

    UserDefaults.standard.set(coin, forKey: "coin")

    coinLabel.text = String(coin)
}
  • 3
    Призыв к synchronize не нужен.
  • 0
    это сработало! Огромное спасибо. :)
0

Почему бы не сделать монету вычисленным свойством, поэтому, когда вы ее используете, она автоматически берет новейшее значение и обновляет метку?

var coin = 0 {
  didSet {
    coinLabel.text = "Matcoin =  \(coin)"
  }
}

func addCoin() {
    if soruSayisi >= 1 && soruSayisi <= 12 {
        //if the number of questions is between 1 and 12
        coin += 10
    }

    UserDefaults.standard.set(coin, forKey: "coin")
}

@IBAction func aButtonClicked(_ sender: UIButton) {

    if "A" == cvpLbl {

        addCoin()
        //correct answer
    }
}

override func viewWillAppear(_ animated: Bool) {
    coin = UserDefaults.standard.integer(forKey: "coin"))
}
  • 2
    Призыв к синхронизации не нужен.
  • 1
    Вы did set синтаксис, это неправильно. Должно быть didSet . Кстати, собственный тип строки Swift - String и он имеет те же инициализаторы, что и NSString поэтому использование инициализатора NSString и приведение к String бессмысленно
Показать ещё 1 комментарий
0
  1. В viewWillAppear прочитайте значение из UserDefaults, назначьте его coin и этикетке. Не забудьте позвонить super

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        coin = UserDefaults.standard.integer(forKey: "coin")
        coinLabel.text = "Matcoin = \(coin)"
    }
    
  2. В addCoin() сначала проверьте, находится ли soruSayisi в диапазоне 1..12. Если да, UserDefaults монету на 10, напишите в UserDefaults и обновите метку. Строка для чтения из UserDefaults является излишней, если coin обновлена. В коде используется оператор сопоставления шаблонов ~= для проверки диапазона и оператора присваивания += для увеличения значения:

    func addCoin() {
        if  1...12 ~= soruSayisi {
            coin += 10
            UserDefaults.standard.set(coin, forKey: "coin")
            coinLabel.text = "Matcoin = \(coin)"
        } else { print("error") }
    }
    

Ещё вопросы

Сообщество Overcoder
Наверх
Меню