该项目可以在这里克隆 https:/github.comrandomjuniorburgerquizapp。
我有一个UIButton,链接到一个使用DispatchQueue.main.asyncAfter的动作。除了当用户滥用TrueFalse按钮或在很短的时间间隔内连续多次触发其中一个按钮,导致延迟重叠,并允许用户获得比预期更高的分数(例如,只有8个问题的答案是 "True",但由于如果滥用True按钮的bug,10分是可能的),该应用程序运行良好。
我想知道如何才能避免这种情况的发生?
NB - 我是一个初学者。这个项目是我尝试重新创建Angela Yu的课程的一个模块。
我欢迎任何关于如何改进我的代码和更接近最佳实践的建议。
单单是按钮的代码就是。
@IBAction func answerPressed(_ sender: UIButton) {
let userAnswer = sender.currentTitle
let actualAnswer = quizArray[questionNumber].answer
if questionNumber < (quizArray.count - 1) {
self.questionNumber += 1
updateProgressBar()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
self.questionLabel.text = self.quizArray[self.questionNumber].text
}
if userAnswer == actualAnswer {
questionLabel.text = "✅"
score += 1
scoreLabel.text = String("Score: \(score) / 12")
} else {
questionLabel.text = "❌"
}
} else if questionNumber == (quizArray.count - 1) && questionLabel.text != "End of Quiz" {
if userAnswer == actualAnswer {
questionLabel.text = "✅"
score += 1
scoreLabel.text = String("Score: \(score) / 12")
} else {
questionLabel.text = "❌"
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
self.progressBar.progress = Float(1)
print("No more questions")
self.questionLabel.text = "End of Quiz"
}
}
}
这里是可能的解决方案--只是不给用户生成不需要的点击的可能性。
sender.isEnabled = false // don't allow action until question updated
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
self.questionLabel.text = self.quizArray[self.questionNumber].text
sender.isEnabled = true // << allow user interaction
}
退而求其次