UINavigationController 中的 UITabBarController 适用于 iOS 8 但不适用于 7

Posted

技术标签:

【中文标题】UINavigationController 中的 UITabBarController 适用于 iOS 8 但不适用于 7【英文标题】:UITabBarController inside UINavigationController works on iOS 8 but not 7 【发布时间】:2014-11-11 15:31:40 【问题描述】:

ios 7 中,对于 UITabBarControllerUINavigationController 中的视图控制器,导航栏会覆盖内容。 在 iOS 8 中,情况并非如此,具有与顶部布局指南相关的约束的项目被完美定位。

如果我将每个选项卡的视图控制器嵌入UINavigationController,那么在 iOS 7 中一切看起来都不错,但在 iOS 8 中,导航栏和视图控制器的内容之间存在空白。

我了解 Apple 在其文档中明确禁止这样做。 UITabBarController 不应被压入 UINavigationController 的堆栈。但这是我想要达到的效果:

在登录屏幕上启动应用程序(这将是 UINavigationController 的根目录)。还没有标签栏。如果登录成功,则将新的UITabBarController 推入堆栈。此时,已登录的用户可以通过切换标签在应用的不同部分之间进行切换。

有解决方法吗?或者有什么不同的方法可以达到这个效果?

【问题讨论】:

【参考方案1】:

找不到令人满意的解决方法。我最终对应用程序进行了重组,使 UITabBarController 成为根,并且登录视图控制器最初以模态方式呈现。

【讨论】:

【参考方案2】:

我最近遇到了同样的问题,我想出了两种方法。为了清楚起见,我将使用 Swift 3.0。希望这可以节省一些时间。

假设 您的应用以 UINavigationController 开头,其中嵌入了您的 LoginController

方法 1:使用应用窗口(推荐) 在您的LoginController中,当用户登录时,只需将应用程序的keyWindowrootViewController 属性更改为您想要的UITabBarController

// LoginController: onLogin
let homeTBC = UITabBarController()
UIApplication.shared.keyWindow?.rootViewController = homeTBC

方法 2:使用 UINavigationController 的堆栈 在您的 LoginController 中,当用户登录时,将您想要的 UITabBarController 设置为您的 navigationController 的根视图控制器。

// LoginController: onLogin
let homeTBC = UITabBarController()
self.navigationController?.viewControllers = [homeTBC]

这个方法的注意事项是你的homeTBC中的viewControllers不能直接访问navigationBar,他们必须通过他们的mother-tabBarController,例如,改变标题homeTBC 中的 viewController 之一,您必须这样做:

self.tabBarController?.navigationItem.title = "My VC Title"

【讨论】:

以上是关于UINavigationController 中的 UITabBarController 适用于 iOS 8 但不适用于 7的主要内容,如果未能解决你的问题,请参考以下文章

(Swift) 在嵌套在 Main UINavigationController 中的 UINavigationController 和 UITabController 之间切换

UINavigationController 中的常量 UIBarButtonItem

UINavigationController 中的 setAlpha

UINavigationController:调整大小动画中的标题跳转

UIPopoverController 中的 UINavigationController:设置标题

UITabBarController 问题中的 UINavigationController