我无法使用NSUserDefaults

时间:2018-02-02 14:46:37

标签: ios swift nsuserdefaults

我正在尝试制作一个测验应用,我想添加最高分,但是当我点击正确的答案按钮时,coinLabel有Matcoin = 10文字。然后我再次点击正确的答案按钮,它应该包含文字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)"
}

3 个答案:

答案 0 :(得分: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)
}

答案 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范围内。如果是,则将硬币加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") }
    }
    

答案 2 :(得分: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"))
}