以下是我的应用的设置:
导航 -
-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。
如何防止标签栏控制器在第二个视图中消失。
答案 0 :(得分:2)
结构应该是
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中共享相同的权重 - 所以使第一个项目呈现模式登录控制器,整个应用程序依赖不喜欢好的程序流程。如果一个应用程序要求用户登录,我认为登录没有任何问题以某种方式支持它。
我在这里的答案中有一个更全面描述的版本:(How to handle UINavigationControllers and UITabBarControllers iOS 6.1)。这样做的另一个好处是,如果您从应用程序的任何位置提供注销按钮,则可以放松回到第一个登录屏幕 - 实际上 un - 显示整个登录的应用程序堆栈 - 将很好地工作
一个不同的解决方案 - 与@ rdelmar一起编辑 - 将是从第一个viewController 以模态方式呈现登录屏幕(如果它不在标签栏控制器中)。这可能在我之前的答案中起作用,因为登录后的第一个屏幕是一个navController嵌入式viewController。然而,退出退出不会那么干净。
最后,我怀疑这可能只是一种风格,只要流逻辑保持稳健,我们就不应该过于担心。
答案 1 :(得分:0)
除非您有另一个未提及的导航控制器,否则您的推送来自您的初始控制器的导航控制器。因此,从中推出,将tableVC置于导航控制器视图控制器中的标签栏控制器之上。
我建议您将标签栏控制器设置为窗口的根视图控制器。在第一个选项卡(来自viewDidAppear方法)中从控制器以模态方式显示loginVC,因此它将在应用程序启动时首先显示。第二个选项卡应该有一个导航控制器作为其根控制器,searchVC作为导航控制器的根视图控制器。