You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:51:02