如何判断是否存在模态UIViewController?

时间:2011-08-09 08:22:49

标签: iphone uiviewcontroller

在调用dismissModalViewControllerAnimated之前,有没有办法判断是否已经提供了模态UIViewController?

5 个答案:

答案 0 :(得分:17)

iOS 9,8,7,6& 5

这个问题的答案太多了,没有一个涵盖所有案例。此外,尽管你在documentation找到了什么,但还有两个选择现已弃用的modalViewController

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

    BOOL modal = nil != [self presentingViewController];

  2. 如果您需要通过模式知道涵盖

    BOOL hiddenByModal = nil != [self presentedViewController];

答案 1 :(得分:9)

  

iOS6 + - 使用presentViewController:   从iOS 6开始,presentedViewController应该被用作已弃用的modalViewController

使用属性:

  

不推荐使用 - modalViewController:   用于活动模态视图的控制器 - 即临时显示在由接收器管理的视图顶部的视图。 (只读)

@property(nonatomic, readonly) UIViewController *modalViewController

答案 2 :(得分:2)

我通常会添加一个名为isModal的BOOL变量,并在初始化一个viewcontroller之后但在调用presentModalViewController之前设置它。类似的东西:

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

然后,在MyViewController中,在需要解雇之前,我只需检查:

if (isModal) { //dismiss modal }

答案 3 :(得分:2)

在iOS 5之后你应该使用:

if (self.presentingViewController != nil) {

     [self dismissViewControllerAnimated:YES completion:^{

    //has dismissViewControllerAnimated
    }];
}

编辑更改iOS版

答案 4 :(得分:1)

我知道这已经有一段时间了,但只是想在这件事上加上我的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