Я разрабатываю приложение-викторину для образовательного использования, и во время тестирования, чтобы убедиться, что оно «защищено от дурака», заметил, что второе нажатие перейдет к следующему вопросу, в результате чего мой тест перепрыгнет на 2 вопроса.
В викторине у меня есть всплывающее окно, которое либо сообщает ученику, что он был прав, либо сообщает ему, какой был правильный ответ. Я задерживаю загрузку следующего вопроса примерно на 4 секунды, чтобы студент мог еще раз быстро просмотреть вопрос и возможные ответы.
Я пытался использовать isUserInteractionEnabled = false, чтобы предотвратить обнаружение второго касания, но, похоже, это не имеет никакого эффекта. Код для этого раздела:
@IBAction func answerPressed(_ sender: UIButton) {
if sender.tag == selectedAnswer {
self.view.isUserInteractionEnabled = false
ProgressHUD.showSuccess("Correct")
print("correct")
score = score + 1
scoreLabel.text = "Score: \(score)"
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute: {
// Put your code which should be executed with a delay here
self.progressClick = self.progressClick + 1
self.questionNumber = self.questionNumber + 1
self.updateProgress()
self.updateQuestion()
})
self.view.isUserInteractionEnabled = true
}
else {
self.view.isUserInteractionEnabled = false
ProgressHUD.showError("Good Try. \(allQuestions.list[questionNumber].revealAnswer)")
print("wrong")
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: {
// Put your code which should be executed with a delay here
self.progressClick = self.progressClick + 1
self.questionNumber = self.questionNumber + 1
self.updateProgress()
self.updateQuestion()
})
self.view.isUserInteractionEnabled = true
}
}
func updateQuestion(){
if questionNumber < (presentNumber + 10) {
questionDiagram.image = UIImage(named:(allQuestions.list[questionNumber].questionPicture))
questionText.text = "Q \(questionNumber + 1). " + allQuestions.list[questionNumber].question
optionA.setTitle(allQuestions.list[questionNumber].optionA, for: UIControl.State.normal)
optionB.setTitle(allQuestions.list[questionNumber].optionB, for: UIControl.State.normal)
optionC.setTitle(allQuestions.list[questionNumber].optionC, for: UIControl.State.normal)
optionD.setTitle(allQuestions.list[questionNumber].optionD, for: UIControl.State.normal)
selectedAnswer = allQuestions.list[questionNumber].correctAnswer
}
else if questionNumber == allQuestions.list.count {
let alert = UIAlertController(title: "Awesome", message: "Finished all the Quizes. Do you want to start again?", preferredStyle: .alert)
let restartAction = UIAlertAction(title: "Restart", style: .default, handler: {action in self.restartQuiz()})
alert.addAction(restartAction)
present(alert, animated: true, completion: nil)
}
else if questionNumber == 10 {
let alert = UIAlertController(title: "Well Done", message: "That Quiz is done. The next Quiz will now load.", preferredStyle: .alert)
let restartAction2 = UIAlertAction(title: "Continue", style: .default, handler: {action in self.restartQuiz()})
alert.addAction(restartAction2)
present(alert, animated: true, completion: nil)
}
}
Возможный дубликат Отключить жест прокрутки назад в Swift





Повторное включение взаимодействия с пользователем является частью того, что необходимо отложить. Изменять
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute: {
// Put your code which should be executed with a delay here
self.progressClick = self.progressClick + 1
self.questionNumber = self.questionNumber + 1
self.updateProgress()
self.updateQuestion()
})
self.view.isUserInteractionEnabled = true
К
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute: {
// Put your code which should be executed with a delay here
self.progressClick = self.progressClick + 1
self.questionNumber = self.questionNumber + 1
self.updateProgress()
self.updateQuestion()
self.view.isUserInteractionEnabled = true
})
И так далее, по всему.
ты можешь это сделать:
UIApplication.shared.beginIgnoringInteractionEvents()
и после перехода к следующему тесту
UIApplication.shared.endIgnoringInteractionEvents()
Исправление с раскадровкой будет заключаться в том, чтобы накладывать все с четким именем UIView:, например, Display, а затем запускать следующие функции, когда это необходимо.
func disallowTouch() {
self.DisplayView.isHidden = false
self.DisplayView.isUserInteractionEnabled = false
{
Вам, конечно, придется создать другую функцию, делающую обратное:
func allowTouch() {
self.DisplayView.isHidden = true
self.DisplayView.isUserInteractionEnabled = true
{
Я надеюсь, что это поможет, так как это не обычное исправление.
Проблема:
Это потому, что вы сразу включаете взаимодействие с пользователем.
Решение:
Вам нужно переместить self.view.isUserInteractionEnabled = true для всех ваших условий внутри метода DispatchQueue, чтобы подождать, прежде чем снова включить его.
Проверьте этот образец:
if sender.tag == selectedAnswer {
self.view.isUserInteractionEnabled = false
ProgressHUD.showSuccess("Correct")
print("correct")
score = score + 1
scoreLabel.text = "Score: \(score)"
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute: {
// Put your code which should be executed with a delay here
self.progressClick = self.progressClick + 1
self.questionNumber = self.questionNumber + 1
self.updateProgress()
self.updateQuestion()
self.view.isUserInteractionEnabled = true //This line moved inside DispatchQueue
})
}
Вы отключаете userInteraction, запускаете некоторые отложенные вещи и немедленно включаете userInteraction. Так что на самом деле он никогда не отключается (нормально на несколько микросекунд). Может быть, вам следует включить взаимодействие с пользователем в конце вашего отправленного кода?