???項(xiàng)目中經(jīng)常會(huì)有模態(tài)方式彈出控制器的地方瓢颅,有時(shí)候我們用的是導(dǎo)航控制器,有時(shí)候用的是導(dǎo)航控制器的頂部UIViewController弛说,還有的時(shí)候用的是AppDelegate的window的rootViewController即UITabBarController挽懦。
???而有時(shí)候我們想實(shí)現(xiàn)一個(gè)通過(guò)在AppDelegate或在其他任何地方能實(shí)現(xiàn)關(guān)閉所有已經(jīng)彈出的模態(tài)控制器的功能。那么以下方法就能派上用場(chǎng)了木人。
???代碼中MainViewController是UITabBarController信柿,MainNavgationController是UITabBarController當(dāng)前選擇的導(dǎo)航控制器,currentVC是當(dāng)前顯示的普通UIViewController虎囚。因?yàn)槟B(tài)控制器可以通過(guò)任何繼承自UIViewController的控制器彈出角塑,而項(xiàng)目中我們可能是用的導(dǎo)航控制器,也有可能用的是普通控制器淘讥,還有可能用的是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;
//第一部分 導(dǎo)航控制器的頂部控制器彈出的模態(tài)
UIViewController *vcPresentVC = currentVC.presentedViewController;
if (vcPresentVC) {
while (vcPresentVC.presentedViewController) {
vcPresentVC = vcPresentVC.presentedViewController;
}
[vcPresentVC dismissViewControllerAnimated:NO completion:nil];
}
//第二部分 導(dǎo)航控制器彈出的模態(tài)
UIViewController *navPresentVC = currentNav.presentedViewController;
if (navPresentVC) {
while (navPresentVC.presentedViewController) {
navPresentVC = navPresentVC.presentedViewController;
}
[navPresentVC dismissViewControllerAnimated:NO completion:nil];
}
//第三部分 tab控制器彈出的模態(tài)
UIViewController *tabPresentVC = mainVC.presentedViewController;
if (tabPresentVC) {
while (tabPresentVC.presentedViewController) {
tabPresentVC = tabPresentVC.presentedViewController;
}
[tabPresentVC dismissViewControllerAnimated:NO completion:nil];
}
}