UIAlertController 未按预期运行

Posted

技术标签:

【中文标题】UIAlertController 未按预期运行【英文标题】:UIAlertController Not Behaving as expected 【发布时间】:2020-10-05 13:59:29 【问题描述】:

我正在尝试从 ViewController A 切换到 ViewController B,并在 ViewController B 中显示带有 UIAlertController 的消息。

在我的 ViewController B 中,我通常会在 viewDidLoad() 中显示这样的消息:

let alertMessage = String(format: "This is an alert!!")
let alertController = UIAlertController(title: "Error!!", message: "This is an alert!!", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "Dismiss", style: .default))
self.present(alertController, animated: true, completion: nil)

我像这样从 A 切换到 B:

let storyBoard:UIStoryboard = UIStoryboard(name:"Main",bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "ViewControllerB") as! ViewControllerTypeB
self.present(nextViewController, animated:false, completion:nil)

当我将代码保留在 ViewController B 的 viewDidLoad() 中时,我的警报不会出现,并且 View Controller B 已成功切换到。我尝试的另一件事是将 ViewController B 的 viewDidLoad() 中的代码更改为:

let alertMessage = String(format: "This is an alert!!")
let alertController = UIAlertController(title: "Error!!", message: "This is an alert!!", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "Dismiss", style: .default))                        
UIApplication.shared.keyWindow?.rootViewController!.present(alertController, animated: true,
                                completion: nil)

现在在这种情况下,当调用从 A 到 B 的代码时,我会看到视图控制器 A 顶部显示的警报,而视图控制器 B 永远不会切换到。

实现此目的的正确方法是什么?

【问题讨论】:

你不应该尝试present viewDidLoad() 中的视图控制器。在viewDidAppear 试试吧。 控制台中没有消息吗?关于呈现不在视图层次结构中,或者已经呈现? @DonMag 谢谢!这正是我所需要的!现在表现如预期 【参考方案1】:

调用UIViewControllerviewDidLoad,不是在显示视图控制器时,而是在它加载到内存中时。如果您希望在 ViewControllerB 中显示警报,则需要使用 viewDidAppear 方法来显示警报。

如果 ViewControllerB 不是层次结构中的最后一个控制器,则可能会出现这样的问题,即当您导航到 ViewControllerC 后返回 ViewControllerB 时会再次显示警报。在这种情况下,您可以维护一个 Bool 属性,该属性可以跟踪 ViewControllerB 是否第一次出现。

【讨论】:

以上是关于UIAlertController 未按预期运行的主要内容,如果未能解决你的问题,请参考以下文章

GKE上的度量指标未按预期运行-缺少部署,节点等

viewDidLoad 未按预期运行

PostAsJsonAsync 未按预期运行

C#“继续”未按预期运行

多线程未按预期运行

NSPredicate - 包含未按预期运行