jer*_*rry 3 master-detail ipad uisplitviewcontroller ios swift
我有一个UISplitViewController嵌入到容器视图中的容器(因为它不在我的应用程序的根目录中),其机制运行良好,除了一个问题:iPad上没有详细视图的导航栏。
初始设置基本上如下:
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)
正在将项目加载到主视图并选择详细信息。
这是IB中的样子(为了节省空间,我显示了iPhone布局,但是无论如何关系都应该可见):
SO处理类似问题的答案很少。最接近的匹配项建议为详细视图添加自己的导航控制器。我不明白为什么这样做是必要的,因为我相信它可以在iPhone上正常工作,这表明细节视图与主(根)视图使用相同的导航控制器。但是我尝试了一下。正如我所怀疑的,结果是最初显示了一个导航栏。但是一旦选择了一项,该条就会消失。以下是设置。
在许多应用程序(邮件,电子邮件,Skype等)中,您可以看到用于主视图和详细视图的单独的顶部栏。尽管从技术上讲我的应用程序并不一定同时需要两者,但尤其是带有彩条的情况下,它并不是很漂亮。因此,问题是:如何获得详细视图的导航栏。
细节视图需要其自己的导航控制器才能在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)
| 归档时间: |
|
| 查看次数: |
1408 次 |
| 最近记录: |