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 中,对于 UITabBarController
和 UINavigationController
中的视图控制器,导航栏会覆盖内容。
在 iOS 8 中,情况并非如此,具有与顶部布局指南相关的约束的项目被完美定位。
如果我将每个选项卡的视图控制器嵌入UINavigationController
,那么在 iOS 7 中一切看起来都不错,但在 iOS 8 中,导航栏和视图控制器的内容之间存在空白。
我了解 Apple 在其文档中明确禁止这样做。 UITabBarController
不应被压入 UINavigationController
的堆栈。但这是我想要达到的效果:
在登录屏幕上启动应用程序(这将是 UINavigationController
的根目录)。还没有标签栏。如果登录成功,则将新的UITabBarController
推入堆栈。此时,已登录的用户可以通过切换标签在应用的不同部分之间进行切换。
有解决方法吗?或者有什么不同的方法可以达到这个效果?
【问题讨论】:
【参考方案1】:找不到令人满意的解决方法。我最终对应用程序进行了重组,使 UITabBarController
成为根,并且登录视图控制器最初以模态方式呈现。
【讨论】:
【参考方案2】:我最近遇到了同样的问题,我想出了两种方法。为了清楚起见,我将使用 Swift 3.0。希望这可以节省一些时间。
假设
您的应用以 UINavigationController
开头,其中嵌入了您的 LoginController
方法 1:使用应用窗口(推荐)
在您的LoginController中,当用户登录时,只需将应用程序的keyWindow
的rootViewController
属性更改为您想要的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:调整大小动画中的标题跳转