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

iOS加载JSON题目后答案验证逻辑异常问题求助

问题修复方案

嘿,我一眼就看到问题出在哪了——你的代码逻辑顺序完全搞反了,而且初始加载的方式也不对!

问题根源

  1. 你在viewDidLoad里直接调用了textFieldShouldReturn,这个方法本来是用来处理用户提交答案的,结果导致App一启动就执行了一次"切换题目"的逻辑,counter直接变成了1,而且此时输入框是空的,完全没必要执行答案判断。
  2. 在textFieldShouldReturn方法里,你先切换了题目并更新UI,之后才去判断用户输入的答案是否正确。这就导致:用户输入的是当前显示题目的答案,但你判断的时候用的却是下一题的答案,自然第一题输入1不触发"right",输入2的时候反而匹配了下一题的答案。

修复步骤

我们把逻辑拆分开,让加载题目和提交答案的职责清晰:

  1. 新增一个专门更新UI的方法,负责根据当前counter显示对应的题目。
  2. 初始加载数据后,调用这个方法显示第一题,而不是调用提交答案的方法。
  3. 在textFieldShouldReturn里,先判断用户输入的答案是否匹配当前显示的题目,再切换到下一题并更新UI。

修复后的完整代码

struct Root : Decodable { let questions : [Question] }
struct Question : Decodable { let number, text, answer : String }

class ViewController: UIViewController, UITextFieldDelegate {
    var counter = 0
    var questions = [Question]()
    @IBOutlet var textLabel: UILabel!
    @IBOutlet var showAnswerLabel: UILabel!
    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 加载JSON数据,增加错误处理避免崩溃
        guard let url = Bundle.main.url(forResource: "0", withExtension: "json") else {
            fatalError("JSON file not found in bundle")
        }
        do {
            let data = try Data(contentsOf: url)
            let result = try JSONDecoder().decode(Root.self, from: data)
            self.questions = result.questions
            // 初始化显示第一题
            updateCurrentQuestion()
        } catch {
            print("Failed to load or parse JSON: \(error.localizedDescription)")
        }
        // 设置输入框代理和返回键类型
        textField.delegate = self
        textField.returnKeyType = .done
    }
    
    // 专门负责更新当前题目UI的方法
    private func updateCurrentQuestion() {
        let question = questions[counter]
        title = question.number
        textLabel.text = question.text
        showAnswerLabel.text = question.answer
        // 清空输入框,提升用户体验
        textField.text = ""
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        // 先获取当前显示的题目,用于答案判断
        let currentQuestion = questions[counter]
        // 忽略输入中的空格,避免误判
        if textField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == currentQuestion.answer {
            print("right")
        }
        // 切换到下一题,循环复用题目列表
        counter = (counter + 1) % questions.count
        // 更新UI显示下一题
        updateCurrentQuestion()
        return true
    }
}

额外优化点

  • 替换了原代码中的try!,增加了guard let和do-catch错误处理,避免JSON文件不存在或解析失败时直接崩溃。
  • 在更新题目时自动清空输入框,用户不用手动删除上一题的答案,操作更流畅。
  • 增加了trimmingCharacters处理,忽略输入内容中的空格,避免用户不小心输入空格导致答案判断错误。

这样修改后,逻辑就完全通顺了:App启动显示第一题,输入正确答案点击done就会打印"right",然后自动切换到下一题,完美匹配你的需求!

内容的提问来源于stack exchange,提问作者user8703776

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:56:38