此UIAlertAction代码有什么问题?不允许点击/点击并在应用中前进

时间:2019-05-25 14:53:29

标签: ios swift uialertcontroller

我参加了Udemy上的Swift / iOS Bootcamp课程。在此之前,对于任何代码或课程,我都没有任何问题,但这使我感到困惑。该模块用于设置UIAlertController和UIAlertAction,并将测验应用重置为测验的开始。测验可以正常进行(至少在这一点上),但是,一旦弹出警报,我将无法单击它。它无法识别任何点击或点击,或者无法前进到收到点击时应调用的功能。

https://imgur.com/Z7Oc6kU

我正在按照本课程中编写的代码进行操作,但是问题之一可能是该课程所使用的Swift / Xcode版本比我早,但我并不是100%积极的。 可能会引起一些混乱。

但是,我曾经尝试利用Apple API文档,一次复制了所有示例代码,并进行调整以满足我的需要(就“确定”之后的调用功能而言),但即使是该代码也没有做到这一点。 t点击一下。我已经搜索了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)
    }
}

如上所述,警报上的“重新启动”按钮应强制测验重新启动。 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")

    }



}

2 个答案:

答案 0 :(得分:0)

尝试在主线程中显示

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

答案 1 :(得分:0)

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

enter image description here

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

  • 您正在构建速度较慢的iPhone XR模拟器。
  • 您可能有一台旧计算机。
  • 您似乎错误地在Simulator应用中启用了慢动画。

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