Есть ли способ узнать, есть ли уже представленный модальный UIViewController, скажем, перед вызовом dismissModalViewControllerAnimated
?
Как узнать, представлен ли модальный UIViewController?
Ответ 1
iOS 9, 8, 7, 6 и 5
Слишком много ответов на этот вопрос, ни один из них не охватывает все случаи. Кроме того, несмотря на то, что вы находите в documentation, существует две альтернативы для устаревших modalViewController
:
-
Если вам нужно знать, являются ли вы модальными:
BOOL modal = nil != [self presentingViewController];
-
Если вам нужно знать, насколько вы покрыты, модальным:
BOOL hiddenByModal = nil != [self presentedViewController];
Ответ 2
iOS6 + - использовать представленныйViewController:Так как iOS 6,
presentedViewController
следует использовать вместоmodalViewController
, который устарел
Используйте это свойство:
Устаревший - modalViewController:Контроллер для активного модального представления - то есть вид, который временно отображается поверх представления, управляемого получателем. (Только для чтения)
@property(nonatomic, readonly) UIViewController *modalViewController
Ответ 3
Я обычно добавляю переменную BOOL, называемую чем-то вроде isModal
, и я устанавливаю ее после инициализации диспетчера представлений, но перед вызовом presentModalViewController
. Что-то вроде:
MyViewController *controller = [[MyViewController alloc] init];
controller.isModal = YES;
[self presentModalViewController:controller animated:YES];
И затем, в MyViewController, перед необходимостью отклонения, я просто проверяю:
if (isModal) { //dismiss modal }
Ответ 4
после iOS 5 вы должны использовать:
if (self.presentingViewController != nil) {
[self dismissViewControllerAnimated:YES completion:^{
//has dismissViewControllerAnimated
}];
}
Отредактировано для изменения версии iOS
Ответ 5
Я понимаю, что это было какое-то время, но просто хотел добавить мои 2 цента к этому вопросу.
Мне нужно было определить, был ли представленный ViewController с модально представленным приложением, когда приложение перешло на задний план, чтобы сначала его отпустить.
Сначала я сделал расширение UIWindow
, чтобы вернуть мне текущий ViewController
:
extension UIWindow {
func getCurrentViewController() -> UIViewController? {
guard let rvc = self.rootViewController else {
return nil
}
if let pvc = rvc.presentedViewController {
return pvc
} else if let svc = rvc as? UISplitViewController, svc.viewControllers.count > 0 {
return svc.viewControllers.last!
} else if let nc = rvc as? UINavigationController, nc.viewControllers.count > 0 {
return nc.topViewController!
} else if let tbc = rvc as? UITabBarController {
if let svc = tbc.selectedViewController {
return svc
}
}
return rvc
}
}
Затем я вошел в appDelegate
и добавил тест на applicationDidEnterBackground()
:
func applicationDidEnterBackground(_ application: UIApplication) {
if let vc = self.window?.getCurrentViewController() {
if vc.presentingViewController != nil {
vc.dismiss(animated: false, completion: nil)
}
}
}
Это решение находится в Swift 3