【问题标题】:How to properly set up UITabBarController programmatically with separate storyboards如何使用单独的故事板以编程方式正确设置 UITabBarController
【发布时间】:2017-05-04 22:28:03
【问题描述】:

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

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

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

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

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

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


主故事板

工作流程 1 故事板

工作流程 2 故事板

【问题讨论】:

  • 您不需要在您的 UITabBarController 中嵌入 UINavigationController。将它们放在您的标签上很好。然后每个标签都有自己的导航。
  • 请查看新的“主情节提要”图片。我在这里举的例子太模糊了,试图简化。我实际上也需要那里的导航控制器。
  • 我不认为将 UITabBarController 放在导航控制器中是受支持的选项。请参阅developer.apple.com/library/content/documentation/WindowsViews/… 了解使用标签栏控制器的四种方法的列表。 (是的,你可以尝试做任何事情,但最好不要违背 UI 标准。)
  • @PhillipMills 我认为你是对的。我在 UINavigationController 中对 UITabBarController 进行了一些搜索,这似乎违反了苹果的指导方针。但是,您应该能够添加一个视图控制器并在该视图控制器上放置一个标签栏并完成我想要做的事情。 stackoverflow.com/questions/576764/…
  • 您可以使用 Interface Builder 中的故事板引用将您的两个工作流直接嵌入到标签栏控制器中,但我同意 Philip 的观点,在导航控制器中嵌入标签栏控制器不是推荐的解决方案。您从根表到标签栏控制器的 segue 应该是模态显示而不是导航推送,您可以摆脱根导航控制器

标签: ios swift uinavigationcontroller storyboard uitabcontroller


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    相关资源
    最近更新 更多