从 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?

UINavigationController 内的 UIPageController 从顶部偏移?

从 UiviewController 切换到 UiNavigationController