这个 UIAlertAction 代码有啥问题?不允许点击/点击并在应用程序中前进

Posted

技术标签:

【中文标题】这个 UIAlertAction 代码有啥问题?不允许点击/点击并在应用程序中前进【英文标题】:What is wrong with this UIAlertAction code? Won't allow a click/tap and move forward in the app这个 UIAlertAction 代码有什么问题?不允许点击/点击并在应用程序中前进 【发布时间】:2019-05-25 14:53:29 【问题描述】:

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

https://imgur.com/Z7Oc6kU

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

但是,我曾尝试利用 Apple API 文档,在某一时刻,复制他们的所有示例代码并进行调整以适应我的需求(在“OK”之后调用的函数方面),但即使该代码也没有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()函数不正确,但它不会打印该行,这表明该函数根本没有被调用。

完整的视图控制器:

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

    




【问题讨论】:

如果您点击重新启动按钮,警报会消失吗?当点击按钮时,您的代码实际上并没有做任何事情,但至少警报应该关闭。 @rmaddy,不,按下“重新启动”按钮时它不会关闭。它完全没有任何作用。可以点击几十次,没有变化。 @matt 我改为“行动”,但没有改变。仍然不会关闭,或从警报继续。 分享startOver的内容 UIAlertController 很好,尝试用 print("something") 替换 self.startOver()。并且“UIAlertAction”不应该用作变量,尽管它正在工作。 【参考方案1】:

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

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

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

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

【讨论】:

确实,问题在于“慢速动画”设置已打开。它要么在我第一次启动应用程序时自动激活(但没有意识到),要么我可能按了 Command-T 以为我在 Safari 中打开一个选项卡,而是激活了慢速动画。当我删除它时,它在animated: false 时运行良好,所以我设置了animated: true,它再次运行良好!所以我在测试true 上打开了慢速,但它似乎不再工作了。我必须让警报在屏幕上停留一分钟左右才能点击它。它不会立即识别水龙头! 我仍然认为您有硬件问题。您是否在某种模拟器中运行?你的慢动画很慢。 我没有运行模拟器。 2017 年末 MBP 运行 Mojave。看起来很慢,但我没有任何东西可以与之相比!【参考方案2】:

尝试在主线程中呈现:

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

【讨论】:

@ItHertz 你有自定义动画,用于警报演示。你做了什么来添加它? animated: true 更改为animated: false 成功!我不知道如何 制作动画或创建自定义动画。我只是按照课程代码/视频显示的内容将其设置为 true。感谢您的信息! @ItHertz 在正常情况下,它也应该与动画一起使用,但你的代码中有一些东西可以阻止它。你的代码中有 UIView.animate 吗? 不,我在任何地方都没有 UIView.animate ......这确实令人沮丧!

以上是关于这个 UIAlertAction 代码有啥问题?不允许点击/点击并在应用程序中前进的主要内容,如果未能解决你的问题,请参考以下文章

如何执行 UIAlertAction 的处理程序?

获取 UIAlertAction 的大小

UIAlertAction 处理程序延迟后运行

在 UIAlertController 中的 UIAlertAction 中将图像居中

UIAlertAction改变颜色[重复]

UIAlertAction 值列表