如何使用单独的故事板以编程方式正确设置UITabBarController

时间:2016-12-19 19:44:16

标签: ios swift uinavigationcontroller storyboard uitabcontroller

我的项目中有三个故事板。有一个主要和两个单独的工作流程故事板。每个故事板都嵌入在自己的导航控制器中。

由于我已将故事板分解为工作流程,因此我必须以编程方式将每个工作流程添加到标签栏。这工作正常。

当我尝试将视图(在工作流程内)推送到工作流程导航控制器上时,会出现问题。似乎永远不会使用工作流的导航控制器。我通过更改每个工作流程的导航栏颜色来验证这一点。

我尝试了两个选项,每个选项都设置在一个工作流程上。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let mainStoryboard = UIStoryboard(name: "Workflow 1", bundle: nil)
    let actionItemStoryboard = UIStoryboard(name: "Workflow 2", bundle: nil)

    let workflow1Controller = mainStoryboard.instantiateViewController(withIdentifier: "navigationController1")
    let workflow1TabItem = UITabBarItem(title: "Item 1", image: nil, selectedImage: nil)
    workflow1Controller.tabBarItem = workflow1TabItem

    let workflow2Controller = actionItemStoryboard.instantiateViewController(withIdentifier: "workflow2")
    let workflow2TabItem = UITabBarItem(title: "Item 2", image: nil, selectedImage: nil)
    workflow2Controller.tabBarItem = workflow2TabItem

    self.viewControllers = [workflow1Controller, workflow2Controller]
}

选项1

将标签视图控制器设置为指向导航控制器(非常确定这是不正确的,但这是我做过的测试)。这会显示我想要的视图但不显示导航项(后退按钮)。

Error pushing navigation controller

选项2

将标签视图控制器设置为指向列表视图(请参见下面的屏幕截图)。这将显示后退按钮,但在单击单元格时,将显示最后一个视图" over"标签。

Error pushing list view

主要演示文稿 enter image description here

工作流程1故事板 Workflow 1 Storyboard

工作流程2故事板 Workflow 2 Storyboard

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,我最终做了以下事情:

  • 从工作流程中删除导航控制器
  • 创建一个“MockTabController”(只是一个放置在视图底部的UITabBar的UIViewController)

既然我有一个带UITabBar的UIViewController,我可以让每个工作流视图扩展这个视图而不是UIViewController,因此我的应用程序(我想要的地方)中的标签栏是一致的。

对于工作流具有UITableViewController的实例,我只是将UITableViewController作为子视图嵌入到ViewController中。 ViewController然后扩展我的MockTabController,结果是一个带有标签栏的TableViewController,不需要任何修改就可以工作。

为了简化整个应用程序的导航,我只需将导航堆栈重置回到标签控制器的开头。单击选项卡栏项会展开所有工作流程,然后按下新工作流程的开始。