在所有内容之上显示一个 UIAlertController 并保持在顶部,即使推送另一个视图(iOS 13)

Posted

技术标签:

【中文标题】在所有内容之上显示一个 UIAlertController 并保持在顶部,即使推送另一个视图(iOS 13)【英文标题】:Present an UIAlertController on top of everything and stay on top even if another view is pushed (iOS 13) 【发布时间】:2020-05-30 07:30:52 【问题描述】:

我正在尝试实现一个UIAlertController,它显示在窗口顶部并保持这种状态直到用户关闭它,即使应用程序尝试推送另一个视图控制器。

我已经阅读了这些问题和答案:

ios - present UIAlertController on top of everything regardless of the view hierarchy

Present ViewController on top of everything regardless of the view hierarchy in IOS 13

虽然在 iOS 13 之前的版本中,所提供的解决方案非常有效,但我一直在尝试在 iOS 13 中解决这个问题:

当我显示UIAlertController 时,它会一直停留在顶部,直到另一个视图控制器被推入导航堆栈。如果发生这种情况,UIAlertController 就会消失。

func showHighPriorityNotification() 
    let alertWindow = UIWindow(frame: UIScreen.main.bounds)
    alertWindow.rootViewController = UIViewController()
    alertWindow.windowLevel = UIWindowLevelAlert + 1
    alertWindow.makeKeyAndVisible()

    let alertController = UIAlertController(title: "Title"), message: "Message"), preferredStyle: .alert)
    alertController.addAction(UIAlertAction(title: "Button"), style: .default))

    if #available(iOS 13, *) 
        // Trying to get this functionality to work in iOS 13.
        if var topController = alertWindow.rootViewController 
            while let presentedViewController = topController.presentedViewController 
                topController = presentedViewController
            
            topController.modalPresentationStyle = .fullScreen
            topController.present(alertController, animated: true)
        
     else 
        // This code works in iOS 12 and below, but NOT in iOS 13.
        alertWindow.rootViewController?.present(alertController, animated: true)
    

在 iOS13 中,是否有某种方法可以将 UIAlertController 保持在顶部并允许视图被推到其下方?正如我所说,在以前的版本中,这很好用。

【问题讨论】:

你为什么要使用#available(iOS 13, *)?所有版本的功能都相同 @x-rw 检查链接的问题,但基本上 Apple 更改了 iOS 13 中的 present 行为。我一直在尝试解决 #available 中的问题。 如果您在您的alertWindow 中显示alertController,它会立即显示并消失吗?如果是这样,试试这个:***.com/questions/58131996/… 你应该回答这个问题,@pepsy :P 【参考方案1】:

您可以使用与在 iOS 12 及更低版本中使用的相同的实现,但您必须对显示警报的窗口进行强引用。

在您当前的代码中 - 在 iOS 13 上运行时 - alertWindow 将在 showHighPriorityNotification 完成后立即销毁,从而消除您的警报。可以通过在其他地方对alertWindow 进行强引用来修复它。

查看this answer 了解实现方式。

【讨论】:

以上是关于在所有内容之上显示一个 UIAlertController 并保持在顶部,即使推送另一个视图(iOS 13)的主要内容,如果未能解决你的问题,请参考以下文章

引导弹出窗口未显示在所有元素之上

Flutter 中的索引堆叠。如何在所有其他小部件之上显示容器?

Android 在一切之上叠加一个视图?

如何在 UIPopoverController 的所有其他视图之上显示 UIAlertController?

JQuery 在现有内容之上插入一个层

当应用程序进入后台时显示覆盖所有内容的窗口