跨Navigation跳轉(類似微信)方案二

作用同方案一(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];
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章