Я пытаюсь создать приложение для викторины, и я хочу добавить самый высокий балл, но когда я нажимаю на правильную кнопку ответа, 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)"
}
Причина заключается в том, что при вызове 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)
}
synchronize
не нужен.
Почему бы не сделать монету вычисленным свойством, поэтому, когда вы ее используете, она автоматически берет новейшее значение и обновляет метку?
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"))
}
did set
синтаксис, это неправильно. Должно быть didSet
. Кстати, собственный тип строки Swift - String
и он имеет те же инициализаторы, что и NSString
поэтому использование инициализатора NSString
и приведение к String
бессмысленно
В viewWillAppear
прочитайте значение из UserDefaults
, назначьте его coin
и этикетке. Не забудьте позвонить super
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
coin = UserDefaults.standard.integer(forKey: "coin")
coinLabel.text = "Matcoin = \(coin)"
}
В 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") }
}
coin = UserDefaults.standard.integer(forKey: "coin") coinLabel.text = "Matcoin = \(coin)"
. Таким образом, при запуске переменная coin всегда будет содержать значение, которое вы сохранили в UserDefaults.