このソリューションは、あなたの一番上のビューコントローラを提供します。たとえば、一番上のビューコントローラが特定のビューコントローラでない場合にのみ、ビューコントローラを表示することができます。これにより
extension UIApplication {
/// The top most view controller
static var topMostViewController: UIViewController? {
return UIApplication.shared.keyWindow?.rootViewController?.visibleViewController
}
}
extension UIViewController {
/// The visible view controller from a given view controller
var visibleViewController: UIViewController? {
if let navigationController = self as? UINavigationController {
return navigationController.topViewController?.visibleViewController
} else if let tabBarController = self as? UITabBarController {
return tabBarController.selectedViewController?.visibleViewController
} else if let presentedViewController = presentedViewController {
return presentedViewController.visibleViewController
} else {
return self
}
}
}
あなたは一番上のビューコントローラがない場合にのみ、最上位のView Controllerが
UIApplication.topMostViewController?.present(viewController, animated: true, completion: nil)
が何であるかを知っているか、あなたのビューコントローラを提示することなく、どこからでもあなたのビューコントローラを提示することができます注意すべき特定のビューコントローラ
if let topVC = UIApplication.topMostViewController, !(topVC is FullScreenAlertVC) {
topVC.present(viewController, animated: true, completion: nil)
}
ことの一つは、現在表示されているUIAlertControllerがありますならば、UIApplication.topMostViewController
は0123を返すということです。 UIAlertController
の上に提示することは奇妙な動作をしており、避けるべきです。そのように、あなたは手動で提示する前!(UIApplication.topMostViewController is UIAlertController)
いることを確認するか、self is UIAlertController
extension UIViewController {
/// The visible view controller from a given view controller
var visibleViewController: UIViewController? {
if let navigationController = self as? UINavigationController {
return navigationController.topViewController?.visibleViewController
} else if let tabBarController = self as? UITabBarController {
return tabBarController.selectedViewController?.visibleViewController
} else if let presentedViewController = presentedViewController {
return presentedViewController.visibleViewController
} else if self is UIAlertController {
return nil
} else {
return self
}
}
}
あなたはストーリーボードを使用しない場合はnilを返すように
else if
ケースを追加する必要がありますか? –@SpaceDust nope – nebs