迅速;委托嵌入式视图控制器和父级

时间:2015-08-12 21:45:24

标签: swift delegates uicontainerview

提前抱歉我无法解释自己。我对编程很陌生,代表团的主题仍然没有找到我。我曾经有过一次很棒的help,但是现在我试图在不同的情况下使用一个代表,我无法做到这一点。我拼凑了一些不起作用的代码,无论我搜索多少,我找不到修复方法。

我在容器视图中有一个带有嵌入式视图控制器(EmbeddedController)的视图控制器(MainController)。我试图在嵌入式控制器中有一个按钮来操作容器视图(containerView)。

EmbeddedController:

protocol ControllerDelegate {
    func hideContainerView()
}

class EmbeddedController: UIViewController {
    var delegate: VControllerDelegate?

    @IBAction func button(sender: AnyObject) {
    delegate?.hideContainerView()
    }
}

MainController:

class MainController: UIViewController, ControllerDelegate {

    @IBOutlet var containerView: UIView!

    func hideContainerView() {
    containerView.hidden = true
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        var vc = EmbeddedController()
        vc.delegate = self
    }
}

有谁知道我做错了什么?为什么这不起作用?

2 个答案:

答案 0 :(得分:7)

我最终做的是将其添加到MainController:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if (segue.identifier == "mySegue") {
        let vc = segue.destinationViewController as! EmbeddedController
        vc.delegate = self
    }
}

在故事板中,我选择了从MainController到EmbeddedController的segue,并将标识符设置为“mySegue”。

如果没有上面的代码,代表将继续返回nil。我一开始并没有考虑这个解决方案,因为我认为segues仅用于在视图控制器之间进行转换,在我看来,我没有看到嵌入式控制器是转换。也许比我更了解的人(此时几乎就是这里的任何人)可以解释这一切是如何融合在一起的。

无论如何,这就是我解决问题的方法,希望其他人也可以从中受益:)

答案 1 :(得分:2)

首先,要避免强烈的参考周期:

protocol ControllerDelegate: class {
    func hideContainerView()
}

class EmbeddedController: UIViewController {
    weak var delegate: ControllerDelegate?

您还没有将新实例化的VC视图添加到容器视图中,而不是将其添加为子VC:

        let vc = EmbeddedController()
        vc.delegate = self
        containerView.addSubview(vc.view)
        self.addChildViewController(vc)
        vc.didMoveToParentViewController(self)