作用同方案一(http://www.lxweimin.com/p/f8befb7304db)
但是代碼和原理更加簡(jiǎn)單
情景
Nav1下的A --push—>B B —Push—>C,但是C是再Nav2下的
原理:
1.在(B —Push—>C)過(guò)程中,在B中做如下操作
// 給Nav2的rootViewController傳輸信息
NIMSession *session = [NIMSession session:chatToken type:NIMSessionTypeP2P];
messageListViewController.shouldJumpToChat = YES;
ChatModel *chatModel = [[ChatModel alloc] initWithSession:session
chatName:chatName
chatToken:chatToken
chatAvatar:chatAvatar
currentCatId:chatCurrentCatId];
messageListViewController.chatModel = chatModel;
// 判斷當(dāng)前navigationController是不是nav2
// NO tabbarController選到Nav2的item上
// 當(dāng)前navigationController要popToRoot
if ([self.navigationController isEqual:nav2])
{
[self.navigationController popToRootViewControllerAnimated:NO];
}
else
{
// 這里要注意下:要先切換到Nav2上.再把老的navigationController來(lái)popToRoot
[self.tabBarController setSelectedIndex:MessageIndex];
[self.navigationController popToRootViewControllerAnimated:NO];
}
2.在Nav2的rootViewController的viewWillAppear或者viewDidAppear中做如下操作
if (self.chatModel && self.shouldJumpToChat)
{
// 這個(gè)dispatch在處理已經(jīng)在nav2下進(jìn)行pop的時(shí)候會(huì)有用,不加的話會(huì)導(dǎo)致pop到nav2的rootViewController后在viewWillAppear或者viewDidAppear確實(shí)走了跳轉(zhuǎn)的代碼,但是不執(zhí)行跳轉(zhuǎn)
// 原因是pop和push兩個(gè)操作執(zhí)行時(shí)間太緊湊,導(dǎo)致push失敗,這個(gè)時(shí)候用 在主線程中異步調(diào)用,把這些操作往后排(異步的作用),來(lái)延時(shí)push,相當(dāng)于空閑時(shí)調(diào)用
dispatch_async(dispatch_get_main_queue(), ^{
// 用拿到的信息創(chuàng)建要跳轉(zhuǎn)的控制器
NIMSession *session = self.chatModel.session;
MessageViewController *sessionVC = [[MessageViewController alloc] initWithSession:session];
sessionVC.chatName = self.chatModel.chatName;
sessionVC.chatToken = self.chatModel.chatToken;
sessionVC.chatAvatar = self.chatModel.chatAvatar;
sessionVC.currentCatId = self.chatModel.currentCatId;
// 跳轉(zhuǎn)
[sessionVC setHidesBottomBarWhenPushed:YES];
[self.navigationController pushViewController:sessionVC animated:YES];
// 信息置為空
self.chatModel = nil;
self.shouldJumpToChat = NO;
});
}
3.其他注意點(diǎn)
pop操作的動(dòng)畫(huà)最好置為NO,不然在已經(jīng)是Nav2的情況下會(huì)蛋疼
[self.navigationController popToRootViewControllerAnimated:NO];
push操作的動(dòng)畫(huà)用YES,情理之中
[self.navigationController pushViewController:sessionVC animated:YES];
雖然tabbarController從Nav1到Nav2的代碼再pop之前,但是調(diào)用popToRootViewControllerAnimated:NO的self.navigationController還是Nav1而不是Nav2
而且必須保持下面順序,不能調(diào)換
[self.tabBarController setSelectedIndex:MessageIndex];
[self.navigationController popToRootViewControllerAnimated:NO];