Что не так с этим кодом UIAlertAction?Не разрешать клик / нажатие и двигаться вперед в приложении - PullRequest
1 голос
/ 25 мая 2019

Я записался на курс по Swift / iOS Bootcamp для Udemy.До этого у меня не было проблем с кодом или уроками, но это поставило меня в тупик.Модуль предназначен для настройки UIAlertController и UIAlertAction, а также для сброса приложения викторины в начале теста.Тест работает как надо (по крайней мере, на данный момент), однако, как только появляется предупреждение, я не могу нажать на него.Он не распознает какие-либо касания или щелчки или не переходит к функции, которая должна вызываться при получении щелчка.

https://imgur.com/Z7Oc6kU

Я следую коду, как написанов курсе, но одна из проблем может заключаться в том, что курс использует более старую версию Swift / Xcode, чем я, но я не уверен на 100%.То, что может вызывать некоторую путаницу.

Однако я однажды попытался использовать Документацию Apple API, скопировав весь их пример кода и приспособившись к моим потребностям (с точки зренияфункции для вызова после «ОК»), но даже этот код не регистрирует щелчок.Я искал в стеке, изменил код, основанный на других форумах, и ничего не помогло.

func nextQuestion() {

    if questionNumber <= allQuestions.list.count - 1 {

        var nextQuestion = allQuestions.list[questionNumber]

        questionLabel.text = nextQuestion.questionText
    }
    else {

        let alert = UIAlertController(title: "Quiz Over", message: "You've Finished the Quiz, Press Restart to Start Over", preferredStyle: .alert)

        let restartAction = UIAlertAction(title: "Restart", style: .default) { (UIAlertAction) in 

              self.startOver()
        }

        alert.addAction(restartAction)

        self.present(alert, animated: true, completion: nil)
    }
}

Как уже упоминалось, кнопка «Перезагрузить» в предупреждении должна принудительно запустить тест.Функция startOver () сбрасывает questionNumber в 0 и вызывает функцию nextQuestion (), а также выводит строку, чтобы я узнал, была ли вызвана функция, что будет означать, что нажатие зарегистрировано, но startOver ()функция неверна, но она не печатает строку, которая указывает, что функция вообще не вызывается.

Full ViewController:

import UIKit

class ViewController: UIViewController {

    //Place your instance variables here
    let allQuestions = QuestionBank()
    var pickedAnswer : Bool = false
    var questionNumber : Int = 0

    @IBOutlet weak var questionLabel: UILabel!
    @IBOutlet weak var scoreLabel: UILabel!
    @IBOutlet var progressBar: UIView!
    @IBOutlet weak var progressLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        let firstQuestion = allQuestions.list[0]
        questionLabel.text = firstQuestion.questionText

    }


    @IBAction func answerPressed(_ sender: AnyObject) {

        if sender.tag == 1 {
            pickedAnswer = true
        }
        else if sender.tag == 2 {
            pickedAnswer = false
        }

        checkAnswer()
        nextQuestion()
    }


    func updateUI() {

    }


    func nextQuestion() {
        questionNumber += 1

        if questionNumber <= allQuestions.list.count - 1 {

            var nextQuestion = allQuestions.list[questionNumber]

            questionLabel.text = nextQuestion.questionText
        }
        else {

            let alert = UIAlertController(title: "Quiz Over", message: "You've Finished the Quiz, Press Restart to Start Over", preferredStyle: .alert)

            let restartAction = UIAlertAction(title: "Restart", style: .default) { action in self.startOver()
            }

            alert.addAction(restartAction)

            self.present(alert, animated: false, completion: nil)
        }
    }


    func checkAnswer() {
        if pickedAnswer == allQuestions.list[questionNumber].answer{
            print("good")
        }
        else if pickedAnswer != allQuestions.list[questionNumber].answer{
            print("bad")
        }


    }


    func startOver() {
        questionNumber = -1
        nextQuestion()
        print(questionNumber)
        print("Restarting")

    }



}

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Я не могу воспроизвести любую проблему на основе кода, который вы показали, как вы можете видеть:

enter image description here

... так что я думаю, что это может быть проблема с вашей настройкой XCode. Возможная проблема:

  • Вы используете медленный симулятор iPhone XR.
  • Возможно, у вас старый компьютер.
  • И вы, кажется, включили медленную анимацию в приложении Simulator по ошибке.

По крайней мере, попробуйте отключить Slow Animations и создать симулятор 5s. Это сделает симулятор намного более отзывчивым. Но на старой машине все еще могут быть проблемы.

0 голосов
/ 25 мая 2019

Попробуйте представить в основной теме:

DispatchQueue.main.async {
        self.present(alert, animated: true, completion: nil)
   }
...