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

jer*_*rry 3 master-detail ipad uisplitviewcontroller ios swift

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

初始设置基本上如下:

  1. 在IB中,将一个Split View Controller拖到情节提要上,这将创建一个Split View Controller,一个导航控制器,一个Table View Controller(主控),一个基本View Controller(Detail)以及将它们连接起来的序列。
  2. 添加带有容器视图的常规视图控制器。创建从容器视图到拆分视图控制器的嵌入Segue。
  3. 在主控制器中的以下代码支持下,将另一个单元从原型单元添加到详细视图控制器:

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
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 添加数据。

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


这是IB中的样子(为了节省空间,我显示了iPhone布局,但是无论如何关系都应该可见):

在此处输入图片说明

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

在此处输入图片说明

在许多应用程序(邮件,电子邮件,Skype等)中,您可以看到用于主视图和详细视图的单独的顶部栏。尽管从技术上讲我的应用程序并不一定同时需要两者,但尤其是带有彩条的情况下,它并不是很漂亮。因此,问题是:如何获得详细视图的导航栏

jer*_*rry 5

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

在此处输入图片说明

关键是要在详细信息视图上获得一个句柄,以便设置所选的项目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
    }
}
Run Code Online (Sandbox Code Playgroud)