问题描述
我正在尝试从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是否第一次出现。