UISplitViewController,重用DetailViewController(Swift)

时间:2018-03-27 16:14:21

标签: ios swift uisplitviewcontroller

设置:在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。我还能做什么,是否有明确的“最佳”方式?

1 个答案:

答案 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
}