使用单个导航栏从嵌入式UISplitViewController返回导航

时间:2017-08-09 07:58:02

标签: ios swift3 uinavigationcontroller uisplitviewcontroller uicontainerview

我想在我的iOS应用程序的几个地方分割视图,它们都不是根视图控制器。我知道拆分视图最初设计为位于应用程序的根目录并提供根导航控制器,并且Apple的指南最初不允许任何变通方法。更新了指南说明

  

您无法将拆分视图控制器推送到导航堆栈。虽然可以在某些其他容器视图控制器中将拆分视图控制器安装为子级,但在大多数情况下不建议这样做。

现在拆分视图模式真的会让我的应用程序受益,我不想在这里重新发明轮子,所以我尝试使用容器视图,主要使用以下步骤:

  1. 使用常规UIViewController创建一个场景。
  2. 添加覆盖整个屏幕的UIContainerView
  3. 在故事板中添加UISplitViewController,创建分割视图控制器,导航控制器,表视图控制器(用于主视图)和常规视图控制器(用于详细视图)。
  4. 从容器视图到拆分视图控制器创建一个嵌入segue。
  5. 这有一些怪癖,我希望最终能够解决这个问题(例如,最初显示细节视图,在iPad上从左侧滑动表格视图显然也试图在主导航上返回导航),但它基本上可以工作。到目前为止,非常好。

    现在,问题是我有两个导航控制器:我的应用程序根目录下的主导航控制器和嵌入式拆分视图中的导航控制器。这给了我两个带独立导航的导航栏,允许我:

    • 使用嵌入式导航控制器
    • 导航回拆分视图的根目录
    • 从封闭式导航控制器中的容器视图导航回来

    除了两个不吸引人的导航栏外,我不希望iPhone用户直接从详细视图中执行第二个。所以接下来的步骤是:

    1. 隐藏外部视图控制器中的导航栏
    2. 在内部导航栏中添加一个后退导航按钮,以接管主导航栏后退按钮的角色
    3. 左边做的是弹出容器的主导航堆栈的视图控制器的后退按钮的实现。问题是:如何从具有自己的导航控制器的嵌入式视图(使用Swift)访问主导航控制器?

2 个答案:

答案 0 :(得分:1)

在开发我的应用时,我不得不面对类似的问题。 我的问题是,我必须在侧栏上显示导航控制器和splitviewcontroller。再一个问题是导航控制器表单splitview到导航控制器。以下是我遵循的步骤

1)在创建拆分视图控制器时,我隐藏了主控和细节的导航控制器并将其设置为根视图,请同时保留顶级导航控制器的参考。

2)我增加了' y' splitview.root.window和视图以适应自定义视图。

3)我使用后退按钮创建了一个自定义视图,然后使用动画处理过渡。

如果您需要代码段,请告诉我们。我现在会分享它。但我必须搜索它。

答案 1 :(得分:1)

访问父母(包含视图控制器)导航控制器的导航堆栈结果很简单:

@IBAction func backButtonTapped(_ sender: UIBarButtonItem) {
    parent?.navigationController?.popViewController(animated: true)
}