如何从ViewController触发嵌入式ContainerViewController的操作以及如何反向操作?

时间:2018-01-03 01:57:35

标签: ios swift triggers embed uicontainerview

有没有人知道如何将一个动作从ViewController传递给它的ContainerViewController。我尝试通过自己触发的操作隐藏容器视图。 ContainerViewController嵌入在容器视图中。

的ViewController:

@IBOutlet weak var ChoseLanguageContainer: UIView!


**ContainerViewController:**

@IBAction func action(_ sender: Any) {

    ViewController().containerView.isHidden = true 

} //I know this does not work

2 个答案:

答案 0 :(得分:0)

我有类似的要求,我创建了自己的委托方法,这些方法在ContainerViewController中实现。

 protocol  ContainerViewControllerDelegate :class{
        func notifyItemChange(any params you need to pass.)
    }

在我的容器ViewController中,我为delegate创建了一个变量。

var changeContainerDelegate :ContainerViewControllerDelegate?

在包含容器的父视图控制器中,我执行了以下操作。

获取嵌入容器中的视图控制器实例。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if let containerViewController = segue.destination as? ContainerViewController{
             containerViewController.changeContainerDelegate = self

            }

在视图控制器中创建容器视图的IBOutlet。

遵守此协议并在View控制器中编写实现。

func changeContainerVC(containerVCName : String ,dataToBePassed:[AnyObject]?) {
       containerView.isHidden = true
}

在ContainerViewController内部的按钮操作中调用委托,如:

changeContainerDelegate?.notifyItemChange()

这对我有用。希望也帮助你!

答案 1 :(得分:0)

在您的代码中:

ViewController().containerView.isHidden = true 

您正在制作ViewController的新实例并使用它来隐藏containerView。这不行。相反,您需要隐藏当前containerView实例的ViewController,即 self

以下是您可以尝试的代码:

class ViewController: UIViewController
{
    @IBOutlet weak var containerView: UIView!

    override func viewDidLoad()
    {
        super.viewDidLoad()
    }

    @IBAction func hideContainerView(_ sender: UIButton)
    {
        self.containerView.isHidden = true
    }
}

查看层次结构:

enter image description here

如果您在此方面遇到任何其他问题,请与我们联系。