推送segue后,我的标签栏控制器消失

这是我的应用程序的设置:

导航-

-loginVC -if登录有效,推送segue-

tab bar controller with 3 tabs: -in the first tab, is a profile display which modal pushes to a profile editor(not issue here) -second tab is a searchVC that pushes to a tableVC that shows results. This is where the tab bar disappears -The third view is just a VC for updating the database this is linked to. 

这就是它在故事板上的工作方式,我确保从searchVC到tableVC的segue是一个推送segue。

如何防止标签栏控制器在第二个视图上消失。

结构应该是

 loginViewController -->modal segue--> tabBarController | | |-->NavController->Item1ViewController | |-->NavController->Item2ViewController | |-->NavController->Item3ViewController 

此时,当您从第2项的第一个viewController按下时,第二个选项卡上的“push”会将整个标签栏控制器推开。

如果你想在loginViewController上使用一个导航栏(为了保持一致性),将它嵌入它自己的navigationController中,但确保你不要从那里继续推进: modal segue或与[self presentViewController:tabBarViewController animated:yes completion:nil]

每个标签栏项目的导航控制器都是可选的(取决于您所使用的导航,显然您确实需要一个用于项目2) – 但您可能希望每个项目都有一个用于一致性。

更新
@rdelmar建议这种使用登录屏幕作为根视图控制器的方法 – 在其上方应用的其余部分是’模态’呈现 – 是对模态segue的误用,并建议在第一次模拟呈现登录屏幕选项卡项目。 我理解这一点,并会给它一些更多的想法,但同样我发现替代方案有点不舒服…标签项应该在tabVC中共享相同的权重 – 所以使第一项呈现一个模态登录控制器,整个应用程序依赖不喜欢好的程序流程。 如果一个应用程序要求用户登录,我认为登录没有任何问题以某种方式支持它。

我在这里的答案中有一个更完整描述的版本:( 如何处理UINavigationControllers和UITabBarControllers iOS 6.1 )。 这样做的另一个好处是,如果您从应用程序的任何位置提供注销按钮,那么放松回到第一个登录屏幕 – 实际上不会显示整个登录的应用程序堆栈 – 将很好地工作。

一个不同的解决方案 – 与@ rdelmar一起编钟 – 将是从第一个viewController以模态方式呈现登录屏幕, 如果它不在标签栏控制器中 。 这可能在我之前的答案中起作用,因为登录后的第一个屏幕是一个navController嵌入的viewController。 然而退出注销不会那么干净。

最后,我怀疑这可能只是一种风格,只要流逻辑保持稳健,我们就不应该过于笼罩。

除非您有另一个您未提及的导航控制器,否则您的推送来自您的初始控制器的导航控制器。 因此,从中推出,将tableVC置于导航控制器视图控制器中的选项卡栏控制器之上。

我建议你让标签栏控制器成为窗口的根视图控制器。 在第一个选项卡(来自viewDidAppear方法)中从控制器以模态方式显示loginVC,以便在应用程序启动时首先显示。 第二个选项卡应该有一个导航控制器作为其根控制器,searchVC作为导航控制器的根视图控制器。