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

Back Navigation from Embedded UISplitViewController Using Single Navigation Bar

我想在我的 iOS 应用程序的多个位置使用拆分视图,其中 none 作为根视图控制器。我了解拆分视图最初设计用于位于应用程序的根目录并提供根导航控制器,并且 Apple 的指南最初不允许任何变通方法。更新指南状态

You cannot push a split view controller onto a navigation stack. Although it is possible to install a split view controller as a child in some other container view controllers, doing is not recommended in most cases.

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

  1. 创建一个有规律的场景UIViewController
  2. 添加一个UIContainerView覆盖整个屏幕。
  3. 添加一个 UISplitViewController 到故事板,创建一个拆分视图控制器、一个导航控制器、一个 table 视图控制器(用于主视图)和一个常规视图控制器(用于详细视图)。
  4. 创建从容器视图到拆分视图控制器的嵌入转场。

这有一些怪癖,我希望最终能解决(例如,最初显示详细视图,在 table 视图中从 iPad 的左侧滑动显然也试图返回导航在主导航上),但它基本上可以工作。到目前为止,还不错。

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

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

  1. 在外部视图控制器中隐藏导航栏
  2. 在内部导航栏中添加一个后退导航按钮来接管主导航栏的后退按钮

剩下要做的是实现弹出主导航堆栈的容器视图控制器的后退按钮。问题是:如何从具有自己的导航控制器(使用 Swift)的嵌入式视图访问主导航控制器?

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

1) 创建拆分视图控制器时,我隐藏了master和detail的导航控制器并将其设置为根视图,请同时保留您的顶级导航控制器的引用。

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

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

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

事实证明,访问父级(包含视图控制器的)导航控制器的导航堆栈非常简单:

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