如何判断是否有模态UIViewController呈现?

15

在调用 dismissModalViewControllerAnimated 方法之前,有没有一种方法可以判断当前是否已经有模态视图控制器被呈现?

5个回答

19

iOS 9、8、7、6 和 5

对于这个问题,已经有太多的答案了,但并不能覆盖所有情况。 此外,尽管在文档中提到的是不建议使用的 modalViewController,但现在有两种可供替代的方式:

  1. 如果你需要知道你自己是否是模态的:

    BOOL modal = nil != [self presentingViewController];

  2. 如果你需要知道你是否被模态所遮盖

    BOOL hiddenByModal = nil != [self presentedViewController];


9
自iOS 6以来,应该使用presentedViewController属性作为已弃用的modalViewController的替代品。使用以下属性:

已弃用 - modalViewController: 活动模态视图的控制器——即暂时显示在接收方管理的视图之上的视图。(只读)

@property(nonatomic, readonly) UIViewController *modalViewController

9
在iOS6中已经弃用,请使用presentedViewController。 - Alex L

2

我通常会添加一个名为isModal的BOOL变量,并在初始化视图控制器后但在调用presentModalViewController之前设置它。例如:

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

然后,在MyViewController中,在需要dismiss之前,我只需进行检查:

if (isModal) { //dismiss modal }

2

iOS 5 及以上版本应使用:

if (self.presentingViewController != nil) {

     [self dismissViewControllerAnimated:YES completion:^{

    //has dismissViewControllerAnimated
    }];
}

修改 iOS 版本


1

我知道这已经过了一段时间,但只是想在这个问题上提供我的意见。

当应用进入后台时,我需要确定是否有以模态方式呈现的 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编写的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接