Swift开发中如何将父ViewController的数据传递给子ViewController?
方案1:给子VC新增属性接收数据(最推荐)
这种方法耦合度最低,也是iOS开发中最常用的页面传值方式。
步骤1:给三个子ViewController新增用于接收数据的属性
示例代码(以ChildOneViewController为例,另外两个子VC同理修改):
class ChildOneViewController: UIViewController { // 新增属性接收父VC传递的模型数据 var detailModel: DataCellViewModel? override func viewDidLoad() { super.viewDidLoad() // 拿到数据后即可渲染对应UI guard let model = detailModel else { return } print(model.name) // 其他UI渲染逻辑... } }
步骤2:在父VC添加子VC的节点给属性赋值
修改父VC的addChildren方法,添加赋值逻辑即可,同时补上你遗漏的detailVC1.didMove(toParent: self)调用,避免子VC生命周期异常:
private func addChildren() { addChild(detailVC1) // 传递数据 detailVC1.detailModel = self.detailModel view.addSubview(detailVC1.view) detailVC1.view.frame = CGRect(x: 0, y: 60, width: view.width, height: 150) detailVC1.didMove(toParent: self) addChild(detailVC2) detailVC2.detailModel = self.detailModel 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) detailVC3.detailModel = self.detailModel view.addSubview(detailVC3.view) detailVC3.view.frame = CGRect(x: view.width, y: toggleView.bottom, width: scrollView.width, height: scrollView.height) detailVC3.didMove(toParent: self) }
方案2:通过parent属性获取父VC实例(不推荐)
如果不想修改子VC的定义,也可以在子VC内部通过系统自带的parent属性拿到父VC实例,再类型转换后取数据,示例代码:
// 在子VC的任意生命周期方法内调用即可 if let parentVC = parent as? DetailViewController { let name = parentVC.detailModel.name // 其他逻辑... }
这种方法的缺点是子VC和父VC强绑定,后续如果子VC要放到其他容器页面中使用,这段代码会直接失效,可复用性差,仅适合临时调试使用。
内容的提问来源于stack exchange,提问作者Garmani
相关产品推荐
相关产品推荐

