You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:20:45