gpt4 book ai didi

ios - UISplitViewController,重用DetailViewController(Swift)

转载 作者:行者123 更新时间:2023-11-30 11:38:10 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com