ios - UISplitViewController,重用DetailViewController(Swift)

标签 ios swift uisplitviewcontroller

设置:在 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/

相关文章:

ios - 亚马逊 MWS 产品 API 返回 401 错误 "Access denied"

iphone - 使用 NSUserDefaults 保存 NSMutableArray

ios - 如何在不使用webview的情况下制作类似groupon应用程序的文本样式?

ios - Swift 通用 TableView 数据源和委托(delegate),协议(protocol)支持 NSManagedObjects,无法获取实体属性,运行时错误

ios - 多个 UISplitView 的一个详细 View

ios - 在 swift 3 的主细节 View Controller 的细节 View Controller 中呈现 View Controller

ios - 如何同时播放2个视频?

ios - 使用异步编程在 TableView 上显示事件指示器 - Swift

ios - Swift 2 NOT 按位运算不按预期运行

ios - 在 UISplitView 中替换我的 detailViewController 在旋转我的应用程序 Objective-C 时崩溃