iOS開發(fā)中
場景切換返回指定頁面是很常見的需求
如果用導(dǎo)航欄切換場景,要回到指定頁面非常簡單颇蜡,因?yàn)閷?dǎo)航欄有popToViewController:animated:方法可以回到指定頁面价说,因?yàn)閷?dǎo)航是一個(gè)棧結(jié)構(gòu),前提是導(dǎo)航欄棧中要有目標(biāo)控制器风秤。
但是:這需要用戶操作鳖目,實(shí)際項(xiàng)目中,導(dǎo)航欄都是自定義的缤弦,增加一些功能比如全局側(cè)滑返回领迈,當(dāng)用戶側(cè)滑返回,返回的是上一級(jí)頁面碍沐,這也很符合實(shí)際狸捅,但是有些頁面要返回到指定頁面,尤其在電商的app上是很常見的累提。只要有導(dǎo)航尘喝,這都是不是問題,
NSArray *arr = self.navigationController.viewControllers;?
[self.navigationController setViewControllers:@[[arr firstObject], self] animated:YES];
拿到導(dǎo)航欄中所有控制器刻恭,重新設(shè)置值瞧省,愛怎么來就怎么來
但是如果沒有導(dǎo)航欄,控制器VC是用present模態(tài)出來鳍贾,只要在vc調(diào)用dismissViewControllerAnimated:completion:方法就可以讓目標(biāo)控制器消失鞍匾,對(duì)于這種單一場景用這個(gè)就足夠了,但是骑科,如果場景比較復(fù)雜呢橡淑?
例如:A present B,??B present C, C present D; 要求:D?dismiss的時(shí)候要回到A。
如果這時(shí)在D中調(diào)用dismissViewControllerAnimated:completion:回到的是C咆爽,不能回到A梁棠;
因此需要理解3個(gè)事情:
1. 負(fù)責(zé)present的控制置森,負(fù)責(zé)?dismiss
2.?A present B,??B present C,?C present D。當(dāng)B dismiss 就可以回到A符糊,? C 凫海、D也跟著銷毀。
3.?A present B,?? B.presentingViewController 正常是A(全屏模式), A.presentedViewController是B (全屏模式).
解決問題:D?dismiss 回到A男娄;
UIViewController *presentingVc = self.presentingViewController;
? ? while(presentingVc.presentingViewController){
? ? presentingVc = vc.presentingViewController;
? ? // 如果?D?dismiss 要求回到B
? ? 這里要增加判斷?presentingVc的類型行贪,
? ? ? ? if ( [presentingVc isKindOfClass:[*********** class]])) {
? ? ? ? ? ? break;
? ? ? ? }
? ? }
}
if (presentingVc) {
[presentingVc dismissViewControllerAnimated:YES completion:nil];
}
iOS 13, 請參考: