如何从容器视图接收信息

时间:2019-09-13 16:42:54

标签: ios swift

我试图获取标头并仅更改View Controller的主体部分,因此我将Container View用作主体。 this is my storyboard 我没有使用委托方法从“ ViewController2”更新“ HomeViewController”标题的问题:

import UIKit

class HomeViewController: UIViewController {

    // MARK: IBOutlets
    @IBOutlet weak var headerTitleLabel: UILabel!

    // MARk: Properties

    // MARK: view life cycles
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let nav = segue.destination as? UINavigationController,
            let vc = nav.viewControllers.first as? ViewController2 {
            vc.delegate = self

        }
    }
}

extension HomeViewController: ReceiveDataFromContainerViewDelegate {
    func setHeader(title: String) {
        self.headerTitleLabel.text = title   
    }
}
import UIKit

protocol ReceiveDataFromContainerViewDelegate: class {
    func setHeader(title: String)
}

class ViewController2: UIViewController {

    // MARK: Properties
    weak var delegate: ReceiveDataFromContainerViewDelegate!

    // MARK: View Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate.setHeader(title: "hello friend")
    }

}

在“ ViewController2”上是“ Button1”,单击时显示“ ViewController3”,现在我不知道如何从ViewController3更新“ HomeViewController”标题,因此在这里我需要您的帮助。

我认为这不是做粘性标头的最佳方法,如果您有更好的主意,我也将不胜感激。

1 个答案:

答案 0 :(得分:0)

好吧,您应该只需要将委托从VC2注入到VC3,也可以是类似的

class ViewController2: UIViewController {

    // MARK: Properties
    weak var delegate: ReceiveDataFromContainerViewDelegate!

    // the function called when button 1 is pressed
    func presentVC3() {
        // I assuming your code doesn't look like this since you seem to be using
        // storyboard segue's but the idea is the same
        let vc3 = VC3()
        vc3.delegate = self.delegate
        ...
    }

}

class ViewController3: UIViewController {

    // MARK: Properties
    weak var delegate: ReceiveDataFromContainerViewDelegate!

但这感觉不对。 我不确定VC2如何“显示” VC3,但更好的主意是让VC2通过HomeViewController中的新方法通知ReceiveDataFromContainerViewDelegate,它应该替换容器视图中的视图控制器。 。 HomeViewController在创建要放入容器视图的VC3时,可以使用与VC2相同的方式在VC3中设置委托。

或者,您也可以使用Notification Center来监听可以发送新标题的自定义通知。您可以在HomeViewController上添加观察者,并在任何一个其他VC,但通常应尽可能避免使用Notification Center,因为它可能导致意外行为,并且很多Notification Center的代码变得难以使用和推理(通常是一个懒惰的解决方案,但是可以它的位置)。