ios - 如何快速从父 ViewController 获取数据到子 ViewController?
问题描述
我是编程新手,我正在尝试构建一个带有上图所示视图的 ios 应用程序。我从 Firebase 检索数据到 Main ViewController 的集合视图中。数据模型如下。
struct DataCellViewModel {
var id: String
var name: String
var logo: URL?
}
When a cell of that collection view is selected, the respective Detail View is opened which has 3 child views. 详细视图中的部分代码如下。
class DetailViewController: UIViewController {
var detailModel: DataCellViewModel
private let detailVC1 = ChildOneViewController()
private let detailVC2 = ChildTwoViewController()
private let detailVC3 = ChildThreeViewController()
init(detailModel: DataCellViewModel) {
self.detailModel = detailModel
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError()
}
override func viewDidLoad() {
super.viewDidLoad()
title = "\(detailModel.name)"
view.backgroundColor = .systemBackground
addChildren()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}
private func addChildren() {
addChild(detailVC1)
view.addSubview(detailVC1.view)
detailVC1.view.frame = CGRect(x: 0, y: 60, width: view.width, height: 150)
addChild(detailVC2)
view.addSubview(detailVC2.view)
detailVC2.view.frame = CGRect(x: 0, y: toggleView.bottom, width: scrollView.width, height: scrollView.height)
detailVC2.didMove(toParent: self)
addChild(detailVC3)
view.addSubview(detailVC3.view)
detailVC3.view.frame = CGRect(x: view.width, y: toggleView.bottom, width: scrollView.width, height: scrollView.height)
detailVC3.didMove(toParent: self)
}
}
所有 3 个子视图都需要获取detailModel
父视图的参数,以便它们可以显示相关数据。但我不确定如何获得它。我不能直接从子视图中调用“DetailViewController.detailModel.name”。你能告诉我怎么做吗?非常感谢你。
解决方案
让所有 3 类子视图控制器符合相同的协议。Loet 称之为 DetailVCProtocol:
protocol DetailVCProtocol {
var detailModel: DataCellViewModel
}
...
class ChildOneViewController: xxx, DetailVCProtocol {
var detailModel: DataCellViewModel
// ...
}
然后在每个子视图控制器发生变化时将 detailModel 传递给它,并在每个子视图控制器上设置一个 didSet 根据需要更新显示。
推荐阅读
- swift - 如何快速从其他 API 解析 JSON
- nvme - 如何使用 nvme-cli 测试 NVME 管理命令异步事件请求(操作码 0x0C)?
- php - Estes Freight Pickup Web 服务基本认证
- reactjs - 在 ScriptLab 中使用 Office UI Fabric React 组件
- php - Symfony 控制器方法无法识别传入的变量
- javascript - 在大型单页应用程序上解决多个(非嵌套)动态生成的 URL 状态的最合适方法是什么
- c# - 如何在数据库中的图表中显示数据?
- algorithm - 查找第一个元素不小于第二个元素的向量对
- c - 使用函数列表在 C 中进行动态方法分派
- postgresql - 将 Long 转换为 Text 的 Cast Id 列类型,因此可以应用 LIKE