如何使用单独的故事板以编程方式正确设置 UITabBarController
How to properly set up UITabBarController programmatically with separate storyboards
我的项目中有三个故事板。有一个主要的和两个独立的工作流故事板。每个故事板都嵌入在自己的导航控制器中。
由于我已将故事板分解为工作流,因此我必须以编程方式将每个工作流添加到选项卡栏。这工作正常。
当我尝试将视图(在工作流中)推送到工作流导航控制器时出现问题。似乎从未使用过工作流的导航控制器。我通过更改每个工作流的导航栏颜色验证了这一点。
我尝试了两个选项,每个选项都设置了一个工作流程。
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
将选项卡视图控制器设置为指向导航控制器(很确定这是不正确的,但这是我所做的测试)。这会显示我想要的视图,但不会显示导航项(后退按钮)。
选项 2
将选项卡视图控制器设置为指向列表视图(参见下面的屏幕截图)。这会显示后退按钮,但在单击单元格时会显示最后一个视图 "over" 选项卡。
主要故事板
工作流 1 故事板
工作流程 2 故事板
为了解决这个问题,我最终做了以下事情:
- 从工作流中删除导航控制器
- 创建一个 "MockTabController"(只是一个 UIViewController,在视图底部放置了一个 UITabBar)
现在我有一个带有 UITabBar 的 UIViewController,我可以让每个工作流视图扩展这个视图而不是 UIViewController,因此标签栏在我的应用程序中是一致的(我在哪里想要它)。
对于工作流具有 UITableViewController 的实例,我只是将 UITableViewController 作为子视图嵌入到 ViewController 中。 ViewController 然后扩展了我的 MockTabController,结果是一个带有标签栏的表 ViewController,不需要任何修改即可工作。
为了简化整个应用程序的导航,我只是重置导航堆栈回到选项卡控制器的开头。单击选项卡栏项目会展开所有工作流,然后推动新工作流的开始。
我的项目中有三个故事板。有一个主要的和两个独立的工作流故事板。每个故事板都嵌入在自己的导航控制器中。
由于我已将故事板分解为工作流,因此我必须以编程方式将每个工作流添加到选项卡栏。这工作正常。
当我尝试将视图(在工作流中)推送到工作流导航控制器时出现问题。似乎从未使用过工作流的导航控制器。我通过更改每个工作流的导航栏颜色验证了这一点。
我尝试了两个选项,每个选项都设置了一个工作流程。
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
将选项卡视图控制器设置为指向导航控制器(很确定这是不正确的,但这是我所做的测试)。这会显示我想要的视图,但不会显示导航项(后退按钮)。
选项 2
将选项卡视图控制器设置为指向列表视图(参见下面的屏幕截图)。这会显示后退按钮,但在单击单元格时会显示最后一个视图 "over" 选项卡。
主要故事板
工作流 1 故事板
工作流程 2 故事板
为了解决这个问题,我最终做了以下事情:
- 从工作流中删除导航控制器
- 创建一个 "MockTabController"(只是一个 UIViewController,在视图底部放置了一个 UITabBar)
现在我有一个带有 UITabBar 的 UIViewController,我可以让每个工作流视图扩展这个视图而不是 UIViewController,因此标签栏在我的应用程序中是一致的(我在哪里想要它)。
对于工作流具有 UITableViewController 的实例,我只是将 UITableViewController 作为子视图嵌入到 ViewController 中。 ViewController 然后扩展了我的 MockTabController,结果是一个带有标签栏的表 ViewController,不需要任何修改即可工作。
为了简化整个应用程序的导航,我只是重置导航堆栈回到选项卡控制器的开头。单击选项卡栏项目会展开所有工作流,然后推动新工作流的开始。