Swift:以编程方式嵌入标签栏控制器后,导航栏消失
Posted
技术标签:
【中文标题】Swift:以编程方式嵌入标签栏控制器后,导航栏消失【英文标题】:Swift: Navigation Bar disappears after programatically embedding tab bar controller 【发布时间】:2015-01-17 22:37:35 【问题描述】:我刚刚以编程方式将标签栏控制器嵌入到我的应用程序中,但它似乎迫使我的 Storyboard 嵌入式导航栏消失,我认为这是因为我现在已将 rootviewController
设置为我的标签栏。
我阅读了answer to this post,因为它似乎问题相似,但是这样做会提示我错误Pushing a navigation controller is not supported
下面是我用 AppDelegate 编写的代码,在这里我创建了我的选项卡视图和一个导航控制器以推送到根视图控制器:
// Set up the tab and navigation bar controllers
var currController = window?.rootViewController
let chatSB = UIStoryboard(name: "Chat", bundle: nil)
let mainSB = UIStoryboard(name: "Main", bundle: nil)
let tabBarController = UITabBarController()
var navigationController = UINavigationController(rootViewController: currController!)
let profileVC = mainSB.instantiateViewControllerWithIdentifier("profileVC") as TimelineTableViewController
let chatVC = chatSB.instantiateViewControllerWithIdentifier("chatInboxVC") as ChatInboxViewController
tabBarController.viewControllers = [profileVC, chatVC, navigationController]
window?.rootViewController = tabBarController
我将如何解决这个问题?
【问题讨论】:
导航控制器是在标签“外部”还是标签中的 VC 有导航控制器? 导航控制器是内部的,例如 Profile 和 Chat 在它们的 Storyboard 上都有自己的内部导航堆栈。 那么,您应该实例化嵌入它们的 UINavigationController 并将它们添加到标签栏控制器,而不是实例化TimelineTableViewController
和 ChatInboxViewController
VC。故事板将负责实例化嵌入在导航控制器中的时间线和聊天 VC
你能给我一个例子作为答案吗?听起来很有希望 - 我第一次不得不在不使用情节提要的情况下构建导航堆栈,我想我过去认为这是理所当然的
【参考方案1】:
如果您想要的视图控制器嵌入在UINavigationController
实例中,您需要实例化这些而不是直接实例化所需的视图控制器。故事板将负责实例化嵌入式视图控制器。
因此,如果您的两个导航控制器场景具有“profileNavController”和“chatInboxNavController”作为它们的标识符,您的代码将是 -
// Set up the tab and navigation bar controllers
var currController = window?.rootViewController
let chatSB = UIStoryboard(name: "Chat", bundle: nil)
let mainSB = UIStoryboard(name: "Main", bundle: nil)
let tabBarController = UITabBarController()
var navigationController = UINavigationController(rootViewController: currController!)
let profileNavController = mainSB.instantiateViewControllerWithIdentifier("profileNavController") as UINavigationController
let chatNavController = chatSB.instantiateViewControllerWithIdentifier("chatInboxNavController") as UINavigationController
tabBarController.viewControllers = [profileNavController, chatNavController, navigationController]
window?.rootViewController = tabBarController
【讨论】:
在我删除了navigationController
和currController
变量后,它工作得非常好——它们一直在抛出Pushing a navigation controller is not supported
。谢谢保罗。以上是关于Swift:以编程方式嵌入标签栏控制器后,导航栏消失的主要内容,如果未能解决你的问题,请参考以下文章
Swift iOS以编程方式在导航栏下方设置scrollView约束