代码之家  ›  专栏  ›  技术社区  ›  B.Kaan

我无法使用NSUserDefaults添加分数

  •  -2
  • B.Kaan  · 技术社区  · 6 年前

    我正在尝试制作一个测验应用程序,我想添加最高分,但当我点击正确答案按钮时,coinLabel Matcoin = 10 文本然后我再次点击正确的答案按钮,它应该有文本 Matcoin = 20 但它有 马特币=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 回复  |  直到 6 年前
        1
  •  1
  •   kd02    6 年前

    原因是调用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)
    }
    
        2
  •  0
  •   vadian    6 年前
    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,将其写入 用户默认值 并更新标签。要从中读取的行 用户默认值 是冗余的,如果 硬币 是最新的。代码使用模式匹配运算符 ~= 检查范围和 加法赋值运算符 += 要增加值,请执行以下操作:

      func addCoin() {
          if  1...12 ~= soruSayisi {
              coin += 10
              UserDefaults.standard.set(coin, forKey: "coin")
              coinLabel.text = "Matcoin = \(coin)"
          } else { print("error") }
      }
      
        3
  •  0
  •   Andrea Vultaggio    6 年前

    为什么不将coin设置为计算属性,以便在使用它时自动获取最新的值并更新标签?

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