UISplitViewController 的详细视图中缺少标题栏
Missing Title Bar in Detail View of UISplitViewController
我有一个 UISplitViewController
嵌入在容器视图中(因为它不在我的应用程序的根目录),除了一个问题外,它的机制运行良好:导航栏因为 iPad.
上缺少详细视图
初始设置基本如下:
- 在 IB 中,将一个 Split View Controller 拖到故事板上,这将创建一个 Split View Controller、一个 Navigation Controller、一个 Table View Controller(Master)、一个基本 View Controller(Detail)和将它们连接起来。
- 添加带有容器视图的常规视图控制器。创建从容器视图到拆分视图控制器的嵌入 Segue。
- 添加另一个从原型单元格到细节视图控制器的 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
}
}
- 添加数据。
正在将项目加载到主视图并选择详细信息。
这是它在 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
}
}
我有一个 UISplitViewController
嵌入在容器视图中(因为它不在我的应用程序的根目录),除了一个问题外,它的机制运行良好:导航栏因为 iPad.
初始设置基本如下:
- 在 IB 中,将一个 Split View Controller 拖到故事板上,这将创建一个 Split View Controller、一个 Navigation Controller、一个 Table View Controller(Master)、一个基本 View Controller(Detail)和将它们连接起来。
- 添加带有容器视图的常规视图控制器。创建从容器视图到拆分视图控制器的嵌入 Segue。
- 添加另一个从原型单元格到细节视图控制器的 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
}
}
- 添加数据。
正在将项目加载到主视图并选择详细信息。
这是它在 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
}
}