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

时间:2015-11-04 02:02:50

标签: swift class button uiviewcontroller uicontainerview

我有一个ViewController,它包含一个ContainerView。 因此,我为ViewController()添加了一个类,为ContainerViews ViewController()添加了一个类。为了更好地说明它,我拍摄了我的storboard场景的照片: enter image description here

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

1 个答案:

答案 0 :(得分:2)

在容器视图中获取父视图控制器并将其转换为父控制器的类型(如中所述)  thefredelement的评论)将起作用,但它有一些缺点。

  1. 您的容器视图应该是恰好恰好的视图 一个MVC本身。作为一种观点,它不应该知道谁在控制它, 但是,它可能知道它有一个可以发送的代理 消息到。例如,UITextView知道它是一个孩子 一类特殊的视图控制器?不,但它知道它可能 有一个代表,它可以发送消息。
  2. 您不能将此视图控制器重用为任何其他视图控制器的子视图,因为它与父类紧密耦合
  3. 只需将收到的父级转换为父级的类型即可绕过类型检查。
  4. 所以“快速修复”可能是按照评论中的建议来做的,但是,我提供这个答案作为一个建议,我认为从长远来看这应该被处理。希望其他人觉得它很有用。我知道对我来说,通过思考过程很有帮助。

    理想情况下,我认为您应该在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引用实际上将您的父设置为容器视图控制器的委托。

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