项目中经常会有模态方式弹出控制器的地方,有时候我们用的是导航控制器,有时候用的是导航控制器的顶部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];
}
}