下面是方案一,不推荐使用,在我们的项目(项目比结构较复杂)时候一段时间后发现了一个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的高度