从UINavigationController堆栈视图中呈现自定义UIAlert

时间:2018-01-31 19:58:24

标签: swift uitableview uiviewcontroller uitabbarcontroller uialertview

我无法从UIViewController堆栈视图中呈现UINavigationController的CustomAlert子类。为了更具描述性,我有UITabBarController包裹UINavigationController。 navController,有一个rootView,另一个被推送到堆栈视图,类型为UITableViewController的leafView。从leafView,我想提出一个类型为UIViewController的alertView,它大部分都是透明的,里面有一个不透明的视图。问题是,在呈现时,此alertView的背景不再是透明的,而是黑色的,并且在解雇时它不会返回到叶控制器,而是返回到rootView。我想我没有从正确的观点提出我的警报。我该如何解决这个问题?

searchController.present(friendAlert, animated: false, completion: nil)

1 个答案:

答案 0 :(得分:3)

对于警报,从顶视图控制器"更容易呈现它们。而不是在层次结构中搜索负责的控制器。查找控制器的天才解决方案显示在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)
    }