此问题在此处已有答案:
How to show UIAlertController from Appdelegate(6个答案)
四年前就关门了。
我尝试下一个代码片段:
var alert = UIAlertController(title: "Alert", message: "Cannot connect to : \(error!.localizedDescription)", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
self.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil)
在我的AppDelegate中,但它会在主控台中打印下一个错误:
Warning: Attempt to present <UIAlertController: 0x7ff6cd827a30> on <Messenger.WelcomeController: 0x7ff6cb51c940> whose view is not in the window hierarchy!
如何修复此错误?
8条答案
按热度按时间zmeyuzjn1#
这就是我现在用来做的。
ddarikpa2#
雨燕五:
ffdz8vbo3#
根据 Jorge 的 回答 , 为 Swift 4 更新
中 的 每 一 个
jfewjypa4#
Swift 3.0或以上,在所有条件下工作,如在标签栏的情况下,在呈现视图的情况下等。
daolsyd05#
我也有类似的问题。
我已经通过在
Main Queue
中显示UIAlertController
修复了这个问题。代码如下所示。
0aydgbwb6#
您是否尝试过使用
UIApplication.shared.keyWindow?.rootViewController?.present(...)
?7rtdyuoh7#
我想您正在调用
applicationDidFinishLunchingWithOptions
中的代码片段。事实上我试过了因为我不得不这么做您尝试执行的操作是正确的,但AppDelegate创建并显示的ViewController即将显示在屏幕上,在此之前,代码段尝试创建alertView并将其放置在RootViewController的不存在视图之上。
我所要做的是将它移到另一个委托调用,该调用保证在RootViewController出现后被调用。
但是要知道AppDelegate的职责。它是处理应用程序生命周期和应用程序范围内的委托调用和事件。如果将代码放在这里是有意义的,那么就这样做。但是如果将代码放在rootViewController或其他部分上会更好,那么也要考虑一下。
总之,希望能有所帮助,干杯!
fcg9iug38#
我建议不要在AppDelegate中这样做。AppDelegate的目的是从OS中处理委托功能,而不是实现警报视图等功能。
如果你想在应用程序开始时显示一个警报视图,我会在你的第一个视图控制器中实现它。