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

作用同方案一(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];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,245評(píng)論 4 61
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,349評(píng)論 25 708
  • 今天跑了馬拉松,第一個(gè),全程。跑之前是有點(diǎn)緊張的,最近跑馬猝死的人太多了,我還專門買了一天的保險(xiǎn)。但是我覺(jué)得我跑完...
    粉紅嬤嬤閱讀 499評(píng)論 0 0
  • 孩子昨天晚上玩到11點(diǎn) 回來(lái)又開(kāi)始補(bǔ)檢查 折騰到 12點(diǎn) 一直發(fā)牢騷 ,但是今天早上還是堅(jiān)持去學(xué)校了 ,我 現(xiàn)在比...
    苦茶_09e4閱讀 265評(píng)論 0 1
  • 追求,需 守的住目的 曾經(jīng),為自己構(gòu)設(shè)下愿景;曾經(jīng),夢(mèng)中多少回沉醉;曾經(jīng),很多個(gè)寂靜的時(shí)候,暗暗摩挲;曾經(jīng),…… ...
    期途閱讀 466評(píng)論 0 6