swift – 如何从ContainerView更新父视图/ viewController的元素?

我有一个ViewController,它包含一个ContainerView.

因此,我为ViewController()添加了一个类,为ContainerViews ViewController()添加了一个类.为了更好地说明它,我拍摄了我的storboard场景的照片:

《swift – 如何从ContainerView更新父视图/ viewController的元素?》

当我单击ContainerView内的按钮时,我想用不同的文本更新Label,我该如何实现?重要说明:ContainerViews按钮是一个单独的ViewController中的IBAction,我想在单独的ViewController()类中更新IBOutlet.非常感谢你的帮助!

最佳答案 获取容器视图中的父视图控制器并将其转换为父控制器的类型(如中所述)

 thefredelement的评论)将起作用,但它有一些缺点.

>您的容器视图应该是恰好恰好的视图
一个MVC本身.作为一种观点,它不应该知道谁在控制它,
但是,它可能知道它有一个可以发送的代理
消息到.例如,UITextView知道它是一个孩子
一类特殊的视图控制器?不,但它知道它可能
有一个代表,它可以发送消息.
>您不能将此视图控制器重用为任何其他视图控制器的子视图,因为它与父类紧密耦合
>通过简单地将收到的父级转换为父级的类型,您将绕过类型检查.

因此,“快速修复”可能是按照评论中的建议进行的,但是,我提供这个答案作为一个建议,我认为从长远来看这应该被处理.希望其他人觉得它很有用.我知道对我来说,通过思考过程很有帮助.

理想情况下,我认为您应该在ContainerViewController中声明一个变量,该变量要么是父视图控制器的Class,要么是更好的父控制器将遵循的协议.然后在准备父视图控制器的segue时,您将设置此变量.

同时,您的父级应该(或者至少可以)将变量声明为容器视图的类型或容器将遵循的其他协议.然后,在准备父项的segue时,获取Container视图控制器的句柄并将其存储在您声明的变量中.

所以像这样:

在您的ContainerViewController中

var myContainerViewDelegate: ParentViewControllerOrProtocol

在父视图控制器中

weak var myChildViewOutlet:  ChildViewControllerOrProtocol

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
  if segue.identifier == "embededSegueToChild" {
    if let dvc = segue.destinationViewController.contentViewController as?  ChildViewControllerOrProtocol {
      dvc.myContainerViewDelegate = self
      myChildViewOutlet = dvc
    }
  }

这样你的ContainerViewController看起来就像是视图对象(我认为它应该被认为是),而myChildViewOutlet变量是你视图的出口(可能应该是弱的).

Container中的myContainerViewDelegate引用实际上将您的父设置为容器视图控制器的委托.

现在两个视图控制器都有一个彼此的句柄

点赞