Swift问答APP中UIButton点击变色后无法延迟恢复至原始颜色
问题分析与修复方案
问题根源
- 控件类型不匹配:代码中
trueButton和falseButton声明为UIStackView,但点击事件的sender是UIButton——你修改了按钮的背景色,却在updateUI里尝试重置栈视图的背景色,操作对象完全不一致,导致颜色无法恢复。 - 索引更新时机错误:触发定时器前就递增了
QuestionNumber,导致updateUI直接加载下一题,按钮颜色的重置逻辑没有针对正确的操作对象生效。
修复步骤与代码修改
1. 修正IBOutlet类型
将两个按钮的IBOutlet从UIStackView改为UIButton(同时确保Storyboard中控件关联正确):
@IBOutlet weak var falseButton: UIButton! @IBOutlet weak var trueButton: UIButton!
2. 调整点击与延迟逻辑
重新组织代码顺序,确保颜色重置、索引更新和题目加载的逻辑正确,同时避免重复点击:
@IBAction func answerButtonPressed(_ sender: UIButton) { let userAnswer = sender.currentTitle let actualAnswer = questionArray[QuestionNumber].answer // 根据答案设置按钮颜色 if userAnswer == actualAnswer { sender.backgroundColor = .green score += 1 } else { sender.backgroundColor = .red score -= 1 } // 暂时禁用按钮避免重复点击 trueButton.isEnabled = false falseButton.isEnabled = false // 延迟0.2秒后执行后续更新 Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: #selector(postAnswerProcessing), userInfo: nil, repeats: false) } @objc func postAnswerProcessing() { QuestionNumber += 1 if QuestionNumber < questionArray.count { updateUI() } else { // 所有题目完成后的处理 questionLabel.text = "Done. Your score is \(score)" trueButton.isHidden = true falseButton.isHidden = true print(score) } } @objc func updateUI() { // 加载新题目 questionLabel.text = questionArray[QuestionNumber].text // 重置按钮状态与颜色 trueButton.backgroundColor = .clear falseButton.backgroundColor = .clear trueButton.isEnabled = true falseButton.isEnabled = true print("Button colors reset and new question loaded") }
关键修改说明
- 统一操作对象为
UIButton,确保颜色修改和重置的是同一个控件。 - 将
QuestionNumber递增逻辑移到延迟回调中,避免提前切换到下一题导致逻辑混乱。 - 增加按钮禁用逻辑,提升交互体验,防止用户在颜色反馈期间重复操作。
内容的提问来源于stack exchange,提问作者krishna chauhan
相关产品推荐
相关产品推荐

