首页 > 解决方案 > 如何快速从父 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”。你能告诉我怎么做吗?非常感谢你。

标签: iosswiftxcode

解决方案


让所有 3 类子视图控制器符合相同的协议。Loet 称之为 DetailVCProtocol:

protocol DetailVCProtocol {
   var detailModel: DataCellViewModel
}

...

class ChildOneViewController: xxx, DetailVCProtocol {
    var detailModel: DataCellViewModel
    //  ...
}

然后在每个子视图控制器发生变化时将 detailModel 传递给它,并在每个子视图控制器上设置一个 didSet 根据需要更新显示。


推荐阅读