结构应该是
loginViewController -->modal segue--> tabBarController
|
|
|-->NavController->Item1ViewController
|
|-->NavController->Item2ViewController
|
|-->NavController->Item3ViewController
目前,当您从项目 2 的第一个 viewController 推进时,第二个选项卡项目上的“推送”会将整个选项卡栏控制器推开。
如果你想在你的 loginViewController 上有一个导航栏(为了保持一致性),将它嵌入它自己的 navigationController 但确保你不要从那里继续:modal
segue 或 present with[self presentViewController:tabBarViewController animated:yes completion:nil]
每个标签栏项目的导航控制器都是可选的(取决于您所追求的导航,显然您确实需要一个用于项目 2) - 但您可能希望每个项目都有一个以保持一致性。
更新
@rdelmar 建议这种使用登录屏幕作为根视图控制器的方法——在该控制器之上应用程序的其余部分是“模态”呈现的——是对模态序列的滥用,并建议在而是第一个选项卡项。我理解这一点并将给它更多的思考,但同样我发现替代方案有点不舒服......选项卡项目应该在 tabVC 中共享相同的权重 - 所以让第一个项目呈现一个模式登录控制器,整个应用程序都依赖于它感觉不是很好的程序流程。如果一个应用程序需要用户登录,我看不出登录有什么问题以某种方式支撑它。
我在这里的答案中有一个更完整的描述版本:(如何处理 UINavigationControllers 和 UITabBarControllers iOS 6.1)。这还有一个好处,如果您在应用程序的任何位置提供一个注销按钮,则返回到第一个登录屏幕的展开切换 - 有效地取消显示整个登录的应用程序堆栈 - 将很好地工作。
一个不同的解决方案 - 与@rdelmar's 一致 -如果第一个 viewController 不在选项卡栏控制器中,则以模态方式显示登录屏幕。这可能在我前面提到的答案中起作用,因为登录后的第一个屏幕是一个嵌入导航控制器的视图控制器。但是,从展开到注销不会那么干净。
最后,我怀疑这可能只是一种风格,只要流逻辑保持健壮,我们就不应过于纠结。