iOS加载JSON题目后答案验证逻辑异常问题求助
问题修复方案
嘿,我一眼就看到问题出在哪了——你的代码逻辑顺序完全搞反了,而且初始加载的方式也不对!
问题根源
- 你在
viewDidLoad里直接调用了textFieldShouldReturn,这个方法本来是用来处理用户提交答案的,结果导致App一启动就执行了一次"切换题目"的逻辑,counter直接变成了1,而且此时输入框是空的,完全没必要执行答案判断。 - 在
textFieldShouldReturn方法里,你先切换了题目并更新UI,之后才去判断用户输入的答案是否正确。这就导致:用户输入的是当前显示题目的答案,但你判断的时候用的却是下一题的答案,自然第一题输入1不触发"right",输入2的时候反而匹配了下一题的答案。
修复步骤
我们把逻辑拆分开,让加载题目和提交答案的职责清晰:
- 新增一个专门更新UI的方法,负责根据当前
counter显示对应的题目。 - 初始加载数据后,调用这个方法显示第一题,而不是调用提交答案的方法。
- 在
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
相关产品推荐
相关产品推荐

