Временно отключить жест касания

Я разрабатываю приложение-викторину для образовательного использования, и во время тестирования, чтобы убедиться, что оно «защищено от дурака», заметил, что второе нажатие перейдет к следующему вопросу, в результате чего мой тест перепрыгнет на 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)   
    }  
}

Вы отключаете userInteraction, запускаете некоторые отложенные вещи и немедленно включаете userInteraction. Так что на самом деле он никогда не отключается (нормально на несколько микросекунд). Может быть, вам следует включить взаимодействие с пользователем в конце вашего отправленного кода?

Tom 08.03.2019 00:05

Возможный дубликат Отключить жест прокрутки назад в Swift

El Tomato 08.03.2019 00:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
279
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Повторное включение взаимодействия с пользователем является частью того, что необходимо отложить. Изменять

    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
    })

}

Другие вопросы по теме