设置:在Xcode中创建样板iOS Master-Detail应用并运行它。每次单击主项目时,它都会重新创建detailVC并将其配置为显示新数据。
前提:这通常是我想要的,但有时它只会改变单个标签中的文字。重新使用现有的DetailVC不是更有意义吗? (至少在这种情况下)
那么最好的方法是什么?
沉思:当我查看样板代码时,我看到MasterVC为detailVC创建了类范围的变量。
var detailViewController: DetailViewController? = nil
它在viewDidLoad
中设置此值,但它从不将它用于任何事情。咦?在prepare(for:sender:)
我们得到此代码
let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
创建DetailViewController
的新实例。如果你在创建后设置了一个断点并将其与类var detailViewController
进行比较,你会发现它们是不同的。
UIStoryboardSegue
正在创建我的新DetailViewController
,可以通过查看文档轻松确认。
您不直接创建segue对象。相反,故事板 运行时必须在两个视图之间执行segue时创建它们 控制器。
我可以删除行选择上的segue并在我的detailVC上手动调用该方法,这可能是最简单的,但是seg中的segue是如此的虚拟和可视化。我可以创建一个自定义segue。我还能做什么,是否有明确的“最佳”方式?
答案 0 :(得分:0)
如果其他人有这个问题,这是我的解决方案,直到有人提出更好的方法。
转到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
}
}
}
在“表视图”区域中创建一个新函数(此新函数是UITableViewDelegate
)
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
detailViewController?.detailItem = object
}