UIAlertController行为异常

问题描述

我正在尝试从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!!",style: .default))                        
UIApplication.shared.keyWindow?.rootViewController!.present(alertController,completion: nil)

现在在这种情况下,当调用从A到B的代码时,我看到了View Controller A顶部显示的警报,并且View Controller B从未切换到。

完成此操作的正确方法是什么?

解决方法

调用UIViewController的{​​{1}}并不是在显示视图控制器时,而是在将其加载到内存中时。如果希望在ViewControllerB中显示警报,则需要使用viewDidLoad方法来显示警报。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...