这个 UIAlertAction 代码有什么问题?不允许 click/tap 并在应用程序中前进

What is wrong with this UIAlertAction code? Won't allow a click/tap and move forward in the app

我参加了 Udemy 上的 Swift/iOS 训练营课程。在此之前,我对任何代码或课程都没有任何问题,但这让我感到难过。该模块是关于设置 UIAlertController 和 UIAlertAction,并将测验应用程序重置为测验的开头。测验正常运行(至少在这一点上),但是,一旦弹出警报,我就无法点击它。它无法识别任何点击或点击,也不会前进到收到点击时应调用的函数。

https://imgur.com/Z7Oc6kU

我正在按照课程中编写的代码进行操作,但其中一个问题可能是课程使用的 Swift/Xcode 版本比我旧,但我不是 100%积极的。 可能会造成一些混乱。

但是,我曾尝试利用 Apple API 文档,在某一时刻,复制了他们所有的示例代码并进行了调整以满足我的需要(在 'OK' 之后调用的函数方面) ),但即使是该代码也没有注册点击。我在 Stack 上搜索过,根据其他论坛更改了代码,但没有任何效果。

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

如前所述,警报上的 'Restart' 按钮应强制重新开始测验。 startOver() 函数将 questionNumber 重置为 0,并调用 nextQuestion() 函数,并打印一行让我知道该函数是否已被调用,这意味着点击已注册,但 startOver()函数不正确,但它不会打印该行,这表明根本没有调用该函数。

完整 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")

    }



}

尝试在主线程中呈现:

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

我无法根据您显示的代码重现任何问题,如您所见:

...所以我认为这可能是您的 Xcode 设置的问题。可能的问题:

  • 您正在构建速度较慢的 iPhone XR 模拟器。
  • 您的电脑可能很旧。
  • 而且您似乎错误地在模拟器应用程序中打开了慢速动画。

至少尝试关闭慢速动画并为 5s 模拟器构建。这将使模拟器的响应速度更快。但是在旧机器上可能仍然存在问题。