iOS测验应用NSUserDefaults分数无法累加问题求助
问题分析与解决方案
看起来你的分数无法累加的核心问题是每次视图加载时,coin变量都被重置为0,没有从UserDefaults中恢复之前保存的数值。让我一步步帮你修复:
1. 修复coin变量的初始化逻辑
你当前定义var coin = 0,每次控制器加载时都会把coin重置为0,哪怕之前已经保存过数值到UserDefaults。我们需要在视图初始化时从UserDefaults读取已有的分数:
var coin = 0 override func viewDidLoad() { super.viewDidLoad() // 从UserDefaults加载之前保存的coin值,如果没有则默认0 coin = UserDefaults.standard.integer(forKey: "coin") // 初始化label显示当前分数 coinLabel.text = "Matcoin = \(coin)" }
2. 简化addCoin方法并移除冗余代码
另外,UserDefaults.standard.synchronize()在iOS 10及以上版本已经被废弃,系统会自动处理同步,不需要手动调用。我们可以优化addCoin方法:
func addCoin() { if soruSayisi >= 1 && soruSayisi <= 12 { coin += 10 // 保存更新后的分数到UserDefaults UserDefaults.standard.set(coin, forKey: "coin") // 更新label显示 coinLabel.text = "Matcoin = \(coin)" } else { print("错误:soruSayisi不在1-12范围内") } }
3. 修复按钮点击的判断逻辑(潜在问题)
注意你在AbuttonClicked里的判断"A" == cvpLbl是有问题的——cvpLbl是UILabel实例,你应该比较它的text属性:
@IBAction func AbuttonClicked(_ sender: Any) { // 确保cvpLbl的text不为空,再进行比较 if let correctAnswer = cvpLbl.text, correctAnswer == "A" { addCoin() } }
额外优化:用计算属性简化coin的读写
如果你想更优雅地处理coin的存储和读取,可以把coin定义为计算属性,这样每次访问时都会自动从UserDefaults读取,赋值时自动保存:
var coin: Int { get { return UserDefaults.standard.integer(forKey: "coin") } set { UserDefaults.standard.set(newValue, forKey: "coin") // 赋值时自动更新label coinLabel.text = "Matcoin = \(newValue)" } } // 此时addCoin方法可以简化为: func addCoin() { if soruSayisi >= 1 && soruSayisi <= 12 { coin += 10 } else { print("错误:soruSayisi不在1-12范围内") } }
这样修改后,每次点击正确答案按钮,分数就会正确累加并保存啦!
内容的提问来源于stack exchange,提问作者B.Kaan
相关产品推荐
相关产品推荐

