下面是方案一,不推薦使用,在我們的項目(項目比結構較複雜)時候一段時間後發現了一個bug,有時會在tabbar上留一行白色區域,正好是navgationBar的高度.而且這種做法比較複雜.不過是一種很有意思的思路!
效果
*微信跳轉,在通訊錄Navi點人聊天
*聊天界面返回的時候tabbar回到了會話列表“微信”的Navi上,而且左滑返回看到的也是“微信”的Navi
實現思路
一個OrignNavigationController包裹我們正常的UITabBarController
以往的寫法
MainTabBarController *mainTabBarController = [[MainTabBarController alloc] init];
self.window.rootViewController = mainTabBarController;
我們的寫法
MainTabBarController *mainTabBarController = [[MainTabBarController alloc] init];
StartNavigationController *nav = [[StartNavigationController alloc] initWithRootViewController:mainTabBarController];
self.window.rootViewController = nav;
點人聊天時我們的操作
1.用tabbarController的NavigationController(即StartNavigationController)進行push操作跳轉到聊天界面
UINavigationController* nav = ((AppDelegate*)[UIApplication sharedApplication].delegate).mainController.navigationController; // 我們用appdele持有tabbarController
[nav pushViewController:sessionVC animated:YES];
2.上面操作以後的效果看起來確實有跳轉,但是如果此時點擊聊天界面的返回按鈕(以微信爲例)返回到的界面是"通訊裏"而不是"微信"的會話列表
3.偷樑換柱-所以我們需要做點操作讓返回的時候回到"微信"
在聊天界面中作如下操作
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
MainTabBarController* mainTabBarController = ((AppDelegate*)[UIApplication sharedApplication].delegate).mainController;
[mainTabBarController setSelectedIndex:MessageIndex]; // tabbar切換回"微信"Navi
// 下一步很關鍵也很難理解,所以重點解釋下
/*
1.要明白self.navigationController是StartNavigationController
2.此時整個app的結構是window包着StartNavigationController,StartNavigationController包着一個棧底控制器MainTabbBarController和一個棧頂控制器聊天Controller
*/
[self.navigationController setViewControllers:@[mainTabBarController,self]];
UINavigationController* navigation = mainTabBarController.viewControllers[self.comingFromNavigationController - 1];
[navigation popToRootViewControllerAnimated:NO]; // 最後記得把"通訊錄"Navi要popToRoot
}
上面的操作主要是對tabbarController的層次界面情況進行調整
4.最後要注意的
StartNavigationController要自定義寫一個,並且設置
[self.navigationBar setTranslucent:YES];
不然會導致該Navi下的控制器下移44的高度