Это решение дает самый верхний вид контроллера, так что вы можете обрабатывать любые специальные условия, прежде чем представлять из него. Например, возможно, вы хотите представить свой контроллер просмотра только в том случае, если контроллер верхнего уровня не является определенным контроллером представления.
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
}
}
}
При этом вы можете представить ваш контроллер представления из любой точки мира без необходимости знать, что самый верхний вид контроллера
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
возвратит UIAlertController
. Представление сверху UIAlertController
имеет странное поведение и его следует избегать. Таким образом, вы должны либо вручную проверить, что !(UIApplication.topMostViewController is UIAlertController)
перед представлением, или добавить else if
дело вернуть ноль, если 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
}
}
}
вы используете раскадровки? –
@SpaceDust nope – nebs