作用同方案一(http://www.jianshu.com/p/f8befb7304db)
但是代碼和原理更加簡單
情景
Nav1下的A --push—>B B —Push—>C,但是C是再Nav2下的
原理:
1.在(B —Push—>C)過程中,在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;
// 判斷當前navigationController是不是nav2
// NO tabbarController選到Nav2的item上
// 當前navigationController要popToRoot
if ([self.navigationController isEqual:nav2])
{
[self.navigationController popToRootViewControllerAnimated:NO];
}
else
{
// 這裏要注意下:要先切換到Nav2上.再把老的navigationController來popToRoot
[self.tabBarController setSelectedIndex:MessageIndex];
[self.navigationController popToRootViewControllerAnimated:NO];
}
2.在Nav2的rootViewController的viewWillAppear或者viewDidAppear中做如下操作
if (self.chatModel && self.shouldJumpToChat)
{
// 這個dispatch在處理已經在nav2下進行pop的時候會有用,不加的話會導致pop到nav2的rootViewController後在viewWillAppear或者viewDidAppear確實走了跳轉的代碼,但是不執行跳轉
// 原因是pop和push兩個操作執行時間太緊湊,導致push失敗,這個時候用 在主線程中異步調用,把這些操作往後排(異步的作用),來延時push,相當於空閒時調用
dispatch_async(dispatch_get_main_queue(), ^{
// 用拿到的信息創建要跳轉的控制器
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;
// 跳轉
[sessionVC setHidesBottomBarWhenPushed:YES];
[self.navigationController pushViewController:sessionVC animated:YES];
// 信息置爲空
self.chatModel = nil;
self.shouldJumpToChat = NO;
});
}
3.其他注意點
pop操作的動畫最好置爲NO,不然在已經是Nav2的情況下會蛋疼
[self.navigationController popToRootViewControllerAnimated:NO];
push操作的動畫用YES,情理之中
[self.navigationController pushViewController:sessionVC animated:YES];
雖然tabbarController從Nav1到Nav2的代碼再pop之前,但是調用popToRootViewControllerAnimated:NO的self.navigationController還是Nav1而不是Nav2
而且必須保持下面順序,不能調換
[self.tabBarController setSelectedIndex:MessageIndex];
[self.navigationController popToRootViewControllerAnimated:NO];