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 并将它们添加到标签栏控制器,而不是实例化 TimelineTableViewControllerChatInboxViewController 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

【讨论】:

在我删除了navigationControllercurrController 变量后,它工作得非常好——它们一直在抛出Pushing a navigation controller is not supported。谢谢保罗。

以上是关于Swift:以编程方式嵌入标签栏控制器后,导航栏消失的主要内容,如果未能解决你的问题,请参考以下文章

Swift-以编程方式导航控制器和标签栏控制器

Swift iOS以编程方式在导航栏下方设置scrollView约束

如何在 Swift 的标签栏项目中设置图像?

这个标签栏控制器应该嵌入在哪里?

以编程方式导航到另一个故事板上的导航控制器和标签栏控制器内的视图控制器

Swift 以编程方式导航到另一个视图控制器/场景