设置:在 Xcode 中创建样板 iOS Master-Detail 应用程序并运行它。每次您单击主项目时,它都会重新创建detailVC并将其配置为显示新数据。
前提:这通常是我想要的,但其他时候它只不过是更改单个标签中的文本。重用现有的 DetailVC 不是更有意义吗? (至少在这种情况下)
那么最好的方法是什么?
思考:当我查看样板代码时,我看到MasterVC为detailVC创建了类范围的var。
var detailViewController: DetailViewController? = nil
它在 viewDidLoad
中设置该值,但之后它不会将其用于任何用途。啊?在 prepare(for:sender:)
中,我们得到了这段代码
let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
它创建 DetailViewController
的新实例。如果您在创建后放置一个断点并将其与类 var detailViewController
进行比较,您会发现它们是不同的。
UIStoryboardSegue
正在创建我的新 DetailViewController
,可以通过查看文档轻松确认。
You do not create segue objects directly. Instead, the storyboard runtime creates them when it must perform a segue between two view controllers.
我可以删除行选择上的segue并手动调用detailVC上的方法,这可能是最简单的,但是segues在IB中是如此纯粹和直观。我也许可以创建一个自定义的转场。我还能做什么?有明确的“最佳”方法吗?
最佳答案
如果其他人有这个问题,这是我的解决方案,直到有人提出更好的解决方案。
转到 Interface Builder 并删除从主 TableView 到DetailVC 的showDetail
segue。然后进入 MasterViewController 类并删除 prepare(for:sender:)
函数。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetail" {
if let indexPath = tableView.indexPathForSelectedRow {
let object = objects[indexPath.row] as! NSDate
let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
controller.detailItem = object
controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
controller.navigationItem.leftItemsSupplementBackButton = true
}
}
}
在Table View区域创建一个新函数(这个新函数是UITableViewDelegate
的一部分)
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
detailViewController?.detailItem = object
}
关于ios - UISplitViewController,重用DetailViewController(Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49517807/