这个 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 代码有啥问题?不允许点击/点击并在应用程序中前进的主要内容,如果未能解决你的问题,请参考以下文章