从 UINavigationController 堆栈视图呈现自定义 UIAlert
Posted
技术标签:
【中文标题】从 UINavigationController 堆栈视图呈现自定义 UIAlert【英文标题】:Present a custom UIAlert from a UINavigationController stack view 【发布时间】:2018-01-31 19:58:24 【问题描述】:我无法从 UINavigationController
堆栈视图中呈现 UIViewController
的子类 CustomAlert。为了更具描述性,我有一个 UITabBarController
包装了一个 UINavigationController
。 navController,有一个 rootView 和另一个推送到堆栈视图,leafView 类型为UITableViewController
。在leafView 中,我想展示一个UIViewController
类型的alertView,它大部分是透明的,内部有一个不透明的视图。问题是在呈现时,这个alertView的背景不再是透明的,而是黑色的,并且在dismiss时它并没有返回到叶子控制器,而是返回到rootView。我认为我没有从正确的角度呈现我的警报。我应该如何解决这个问题?
searchController.present(friendAlert, animated: false, completion: nil)
【问题讨论】:
【参考方案1】:对于警报,从“顶视图控制器”显示它们比在层次结构中搜索负责的控制器要容易得多。 this answer:
extension UIApplication
class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController?
if let navigationController = controller as? UINavigationController
return topViewController(controller: navigationController.visibleViewController)
if let tabController = controller as? UITabBarController
if let selected = tabController.selectedViewController
return topViewController(controller: selected)
if let presented = controller?.presentedViewController
return topViewController(controller: presented)
return controller
然后您可以在任何地方显示您的警报,在解除警报后您将立即返回当前视图控制器:
DispatchQueue.main.async
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: _ in ))
UIApplication.topViewController()?.present(alert, animated: true, completion: nil)
【讨论】:
我喜欢你的方法。它有点工作,从某种意义上说,现在我可以肯定地看到基于 UIViewController 的警报开始与导航控制器重叠并从内部显示警报视图。然而它仍然回到黑色背景而不是透明背景,并且在返回时我仍然得到 uinavigationcontroller 的根视图。以上是关于从 UINavigationController 堆栈视图呈现自定义 UIAlert的主要内容,如果未能解决你的问题,请参考以下文章
从 UINavigationController 切换到 UISplitviewController
从UINavigationController中控制UINavigationItem内容
从 UINavigationController 设置 UITabBarItem 标题?
如何从 UINavigationController 隐藏 UINavigationBar?