这个 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,并将测验应用程序重置为测验的开头。测验正常运行(至少在这一点上),但是,一旦弹出警报,我就无法点击它。它无法识别任何点击或点击,也不会前进到收到点击时应调用的函数。
我正在按照课程中编写的代码进行操作,但其中一个问题可能是课程使用的 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 模拟器构建。这将使模拟器的响应速度更快。但是在旧机器上可能仍然存在问题。
我参加了 Udemy 上的 Swift/iOS 训练营课程。在此之前,我对任何代码或课程都没有任何问题,但这让我感到难过。该模块是关于设置 UIAlertController 和 UIAlertAction,并将测验应用程序重置为测验的开头。测验正常运行(至少在这一点上),但是,一旦弹出警报,我就无法点击它。它无法识别任何点击或点击,也不会前进到收到点击时应调用的函数。
我正在按照课程中编写的代码进行操作,但其中一个问题可能是课程使用的 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 模拟器构建。这将使模拟器的响应速度更快。但是在旧机器上可能仍然存在问题。