在所有内容之上显示一个 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 中的索引堆叠。如何在所有其他小部件之上显示容器?