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