UISplitViewController 的详细视图中缺少标题栏

Missing Title Bar in Detail View of UISplitViewController

我有一个 UISplitViewController 嵌入在容器视图中(因为它不在我的应用程序的根目录),除了一个问题外,它的机制运行良好:导航栏因为 iPad.

上缺少详细视图

初始设置基本如下:

  1. 在 IB 中,将一个 Split View Controller 拖到故事板上,这将创建一个 Split View Controller、一个 Navigation Controller、一个 Table View Controller(Master)、一个基本 View Controller(Detail)和将它们连接起来。
  2. 添加带有容器视图的常规视图控制器。创建从容器视图到拆分视图控制器的嵌入 Segue。
  3. 添加另一个从原型单元格到细节视图控制器的 segue,由主控制器中的以下代码支持:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.performSegue(withIdentifier: "showDetail", sender: nil)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetail" {
        let destinationViewController = segue.destination as! DetailViewController
        let path = self.tableView.indexPathForSelectedRow! as  NSIndexPath
        destinationViewController.selectedTrainingId = (self.itemList[path.row] as! MyListItem).id
    }
}
  1. 添加数据。

正在将项目加载到主视图并选择详细信息。


这是它在 IB 中的样子(为了保存 space 我展示了 iPhone 布局,但无论如何关系应该是可见的):

SO处理类似问题的答案很少。最接近的匹配项建议为详细视图添加一个自己的导航控制器。我不明白为什么这是必要的,因为它在 iPhone 上按预期工作的事实我相信表明详细视图使用与主(根)视图相同的导航控制器。但我试了一下。正如我所怀疑的,结果是最初显示了一个导航栏。但是一旦选择了一个项目,该栏就会消失。下面是设置。

在许多应用程序(消息、电子邮件、Skype 等)中,您可以看到单独的顶部栏用于主视图和详细视图。虽然从技术上讲我的应用程序并不绝对需要两者,但它并不是很漂亮,尤其是带有彩色条。所以,问题是:如何获得详细视图的导航栏

详细视图需要自己的导航控制器才能在 iPad 上显示导航栏。因此,问题中的第二张图片显示了正确的设置,但细节 segue 需要指向导航控制器。

关键是获取详细视图的句柄,以便设置所选项目的 id,这可以通过对原始代码进行小的更改来完成:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetail" {

        // Destination View Controller
        let destinationNavigationcontroller: UINavigationController! = segue.destination as! UINavigationController
        let destinationViewController: DetailViewController! = destinationNavigationcontroller.topViewController as! DetailViewController

        // Selected Row ID
        let path = self.tableView.indexPathForSelectedRow! as  NSIndexPath
        destinationViewController.selectedId = (self.itemList[path.row] as! MyListItem).id
    }
}