ios 在Swift的AppDelegate中显示警报[重复]

gfttwv5a  于 2022-11-19  发布在  iOS
关注(0)|答案(8)|浏览(154)

此问题在此处已有答案

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!

如何修复此错误?

zmeyuzjn

zmeyuzjn1#

这就是我现在用来做的。

var alertController = UIAlertController(title: "Title", message: "Any message", preferredStyle: .ActionSheet)
var okAction = UIAlertAction(title: "Yes", style: UIAlertActionStyle.Default) {
                    UIAlertAction in
                    NSLog("OK Pressed")
                }
var cancelAction = UIAlertAction(title: "No", style: UIAlertActionStyle.Cancel) {
                    UIAlertAction in
                    NSLog("Cancel Pressed")
                }
alertController.addAction(okAction)
alertController.addAction(cancelAction)
self.window?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)
ddarikpa

ddarikpa2#

雨燕五:

let alert = UIAlertController(title: "Test", message:"Message", preferredStyle: UIAlertController.Style.alert)
        
// add an action (button)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
       
// show the alert
self.window?.rootViewController?.present(alert, animated: true, completion: nil)
ffdz8vbo

ffdz8vbo3#

根据 Jorge 的 回答 , 为 Swift 4 更新

let alertController = UIAlertController(title: "Title", message: "Message", preferredStyle: .actionSheet)
let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default) {
        UIAlertAction in
        NSLog("OK Pressed")
    }
let cancelAction = UIAlertAction(title: "CANCEL", style: UIAlertActionStyle.cancel) {
        UIAlertAction in
        NSLog("Cancel Pressed")
    }
alertController.addAction(okAction)
alertController.addAction(cancelAction)
self.window?.rootViewController?.present(alertController, animated: true, completion: nil)

中 的 每 一 个

jfewjypa

jfewjypa4#

Swift 3.0或以上,在所有条件下工作,如在标签栏的情况下,在呈现视图的情况下等。

let alert = UIAlertController(title: "Test", message:"Message", preferredStyle: UIAlertControllerStyle.alert)

// add an action (button)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))

// show alert
let alertWindow = UIWindow(frame: UIScreen.main.bounds)
alertWindow.rootViewController = UIViewController()
alertWindow.windowLevel = UIWindowLevelAlert + 1;
alertWindow.makeKeyAndVisible()
alertWindow.rootViewController?.present(alertController, animated: true, completion: nil)
daolsyd0

daolsyd05#

我也有类似的问题。
我已经通过在Main Queue中显示UIAlertController修复了这个问题。
代码如下所示。

let alert = UIAlertController(title: "My Title", message: "My Message", preferredStyle: .alert)

let actionYes = UIAlertAction(title: "Yes", style: .default, handler: { action in
    print("action yes handler")
})

let actionCancel = UIAlertAction(title: "Cancel", style: .destructive, handler: { action in
    print("action cancel handler")
})

alert.addAction(actionYes)
alert.addAction(actionCancel)

DispatchQueue.main.async {
    self.window?.rootViewController?.present(alert, animated: true, completion: nil)
}
0aydgbwb

0aydgbwb6#

您是否尝试过使用UIApplication.shared.keyWindow?.rootViewController?.present(...)

7rtdyuoh

7rtdyuoh7#

我想您正在调用applicationDidFinishLunchingWithOptions中的代码片段。
事实上我试过了因为我不得不这么做您尝试执行的操作是正确的,但AppDelegate创建并显示的ViewController即将显示在屏幕上,在此之前,代码段尝试创建alertView并将其放置在RootViewController的不存在视图之上。
我所要做的是将它移到另一个委托调用,该调用保证在RootViewController出现后被调用。

func applicationDidBecomeActive(application: UIApplication) {
    //This method is called when the rootViewController is set and the view.
    // And the View controller is ready to get touches or events.
    var alert = UIAlertController(title: "Alert", message: "Cannot connect to :", preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
    self.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil)            
}

但是要知道AppDelegate的职责。它是处理应用程序生命周期和应用程序范围内的委托调用和事件。如果将代码放在这里是有意义的,那么就这样做。但是如果将代码放在rootViewController或其他部分上会更好,那么也要考虑一下。
总之,希望能有所帮助,干杯!

fcg9iug3

fcg9iug38#

我建议不要在AppDelegate中这样做。AppDelegate的目的是从OS中处理委托功能,而不是实现警报视图等功能。
如果你想在应用程序开始时显示一个警报视图,我会在你的第一个视图控制器中实现它。

相关问题