iOS开发之关闭所有已弹出模态控制器

   项目中经常会有模态方式弹出控制器的地方,有时候我们用的是导航控制器,有时候用的是导航控制器的顶部UIViewController,还有的时候用的是AppDelegate的window的rootViewController即UITabBarController。

   而有时候我们想实现一个通过在AppDelegate或在其他任何地方能实现关闭所有已经弹出的模态控制器的功能。那么以下方法就能派上用场了。

   代码中MainViewController是UITabBarController,MainNavgationController是UITabBarController当前选择的导航控制器,currentVC是当前显示的普通UIViewController。因为模态控制器可以通过任何继承自UIViewController的控制器弹出,而项目中我们可能是用的导航控制器,也有可能用的是普通控制器,还有可能用的是UITabBarController,因此我们需要做三次处理。AppDelegate中代码如下。

- (void)closeAllPresentedViewControllers {

    

    if (![self.window.rootViewController isKindOfClass:[MainViewController class]]) {

        return;

    }

    MainViewController *mainVC = (MainViewController *)self.window.rootViewController;

    MainNavgationController *currentNav = mainVC.viewControllers[mainVC.selectedIndex];

    UIViewController *currentVC = currentNav.topViewController;

    

    //第一部分 导航控制器的顶部控制器弹出的模态

    UIViewController *vcPresentVC = currentVC.presentedViewController;

    if (vcPresentVC) {

        while (vcPresentVC.presentedViewController)  {

            vcPresentVC = vcPresentVC.presentedViewController;

        }

        [vcPresentVC dismissViewControllerAnimated:NO completion:nil];

    }

    

    //第二部分 导航控制器弹出的模态

    UIViewController *navPresentVC = currentNav.presentedViewController;

    if (navPresentVC) {

        while (navPresentVC.presentedViewController)  {

            navPresentVC = navPresentVC.presentedViewController;

        }

        [navPresentVC dismissViewControllerAnimated:NO completion:nil];

    }

    

    //第三部分 tab控制器弹出的模态

    UIViewController *tabPresentVC = mainVC.presentedViewController;

    if (tabPresentVC) {

        while (tabPresentVC.presentedViewController)  {

            tabPresentVC = tabPresentVC.presentedViewController;

        }

        [tabPresentVC dismissViewControllerAnimated:NO completion:nil];

    }

    

}

你可能感兴趣的:(iOS开发之关闭所有已弹出模态控制器)