Как узнать, представлен ли модальный UIViewController? - PullRequest
14 голосов
/ 09 августа 2011

Есть ли способ узнать, есть ли модальный UIViewController, уже представленный, скажем, перед вызовом dismissModalViewControllerAnimated?

Ответы [ 5 ]

17 голосов
/ 24 июля 2014

iOS 9, 8, 7, 6 и 5

Слишком много ответов на этот вопрос, ни один не охватывает все случаи. Кроме того, несмотря на то, что вы найдете в документации , есть две альтернативы в настоящее время устарела modalViewController:

  1. Если вам нужно знать, являются ли вы модальными:

    BOOL modal = nil != [self presentingViewController];

  2. Если вам нужно знать, если вы покрыты модальным:

    BOOL hiddenByModal = nil != [self presentedViewController];

9 голосов
/ 09 августа 2011

iOS6 + - используйте presentViewController: Поскольку iOS 6, вместо нее следует использовать presentedViewController в качестве modalViewController, который устарел

Использовать свойство:

Устаревший - modalViewController: Контроллер для активного модального представления, то есть представления, которое временно отображается поверх представления, управляемого приемником.(только для чтения)

@property(nonatomic, readonly) UIViewController *modalViewController
2 голосов
/ 05 февраля 2013

после iOS 5 вы должны использовать:

if (self.presentingViewController != nil) {

     [self dismissViewControllerAnimated:YES completion:^{

    //has dismissViewControllerAnimated
    }];
}

Отредактировано для изменения версии iOS

2 голосов
/ 09 августа 2011

Я обычно добавляю переменную BOOL, которая называется что-то вроде isModal, и я устанавливаю ее после инициализации viewcontroller, но перед вызовом presentModalViewController. Что-то вроде:

MyViewController *controller = [[MyViewController alloc] init];
controller.isModal = YES;
[self presentModalViewController:controller animated:YES];

И затем, в MyViewController, перед тем как уволить, я просто проверяю:

if (isModal) { //dismiss modal }
1 голос
/ 18 мая 2017

Я понимаю, что это было какое-то время, но я просто хотел добавить 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...