从委托人那里展示警报控制器

Posted

技术标签:

【中文标题】从委托人那里展示警报控制器【英文标题】:Presenting Alert Controller from the delegate 【发布时间】:2021-03-12 00:40:01 【问题描述】:

在question/answer 的上下文中,我已经尝试过,但结果是没有显示警报。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
    // Override point for customization after application launch.
    
    
    let alertController = UIAlertController(title: "Error", message: "ABc", preferredStyle: UIAlertController.Style.alert)
    alertController.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
    
    let win = UIWindow(frame: UIScreen.main.bounds)
    let vc = UIViewController()
    vc.view.backgroundColor = .clear
    win.rootViewController = vc
    win.windowLevel = UIWindow.Level.alert + 1  // Swift 3-4: UIWindowLevelAlert + 1
    win.makeKeyAndVisible()
    vc.present(alertController, animated: true, completion: nil)

    return true


根据答案尝试 2。

【问题讨论】:

我不明白为什么UIWindow 需要参与。 为什么要在 AppDelegate 中显示警报?! 我在应用程序加载之前运行了一些与启动前相关的东西,如果出现任何问题,我需要提供一条警报消息。有什么解决办法吗? 解决方案是在加载后在第一个视图控制器中呈现。 @cora code sn-p 请,我尝试了下面的答案,但 self.window 开头为零 【参考方案1】:

使用以下行:

self.window?.rootViewController?.present(alertController, animated: true, completion: nil)

代替

vc.present(alertController, animated: true, completion: nil)

问题解决了。

示例:

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.5, execute: 
        let alertController = UIAlertController(title: "Alert Title", message:
          "Message", preferredStyle: .actionSheet)

        let okAction = UIAlertAction(title: "Ok", style:.default) 
            UIAlertAction in
            NSLog("OK Pressed")
        

        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) 
            UIAlertAction in
            NSLog("Cancel Pressed")
        

        alertController.addAction(okAction)
        alertController.addAction(cancelAction)
        self.window?.rootViewController?.present(alertController, animated: true, completion: nil)
    )

【讨论】:

self.windowdidFinishLaunchingWithOptions 方法中为零 您好,您可以尝试一下您的答案并发布一个工作示例吗? @AppDeveloper 请查看我的更新答案 不行,i.stack.imgur.com/i5raz.png,你也有编译错误,请测试代码。 抱歉,nops,i.stack.imgur.com/GpnGV.png 也增加了延迟,我在我的应用程序中使用导航控制器作为初始视图控制器,有区别吗?你能把你的截图贴出来吗?

以上是关于从委托人那里展示警报控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何从导航堆栈中推送/弹出uiviewcontroller时收到警报

在 UI 自动化测试中解除警报时未调用 UIAlertView 的委托方法“clickedButtonAtIndex”

如何使用委托给 self 调用 presentViewController?

对象在 UIAlertView 委托被调用之前被释放

从 appdelegate 展示一个视图控制器

如何通过导航控制器传递委托?