【问题标题】:Swift; delegate embedded view controller and parent迅速;委托嵌入式视图控制器和父级
【发布时间】:2015-11-05 16:41:52
【问题描述】:

抱歉,我无法很好地解释自己。我对编程真的很陌生,委托的话题仍然让我难以理解。以前我有过一些很棒的help,但现在我尝试在不同的情况下使用委托,但我做错了。我拼凑了一些不起作用的代码,无论我搜索多少,我都找不到修复它的方法。

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

嵌入式控制器:

protocol ControllerDelegate {
    func hideContainerView()
}

class EmbeddedController: UIViewController {
    var delegate: VControllerDelegate?

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

主控制器:

class MainController: UIViewController, ControllerDelegate {

    @IBOutlet var containerView: UIView!

    func hideContainerView() {
    containerView.hidden = true
    }

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

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

【问题讨论】:

    标签: swift delegates uicontainerview


    【解决方案1】:

    首先,要避免强引用循环:

    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)
    

    【讨论】:

    • 我必须研究这些强有力的参考资料,我可能到处都做错了。在没有某种导师的情况下,仅从书籍中很难学到其中的一些东西……我没有将其添加为儿童 VC,因为我认为这是自动完成的,因为我通过故事板创建了所有内容。我现在就去试试你的解决方案,谢谢!
    • 遗憾的是这不起作用,按钮变得不可点击。如果我删除 containerView.addSubview(vc.view) 按钮可以再次点击,但视图仍然没有被隐藏。谢谢你的好意!
    • 按钮 100% 在嵌入视图上,而不是在容器视图上?
    • 是的,一切都是用故事板制作的,按钮在嵌入式控制器中。所以在我的故事板中,我有 2 个视图控制器,一个带有容器视图的主控制器,连接到其中有按钮的嵌入式控制器。主控制器 -> 嵌入式控制器 -> 按钮
    • 如果嵌入式控制器通过 storyboard embed segue 连接到容器,则不需要 main 的 viewDidLoad 中的任何代码。您可以将委托连接到情节提要中的 MainVC(右侧属性窗格中的最后一个选项卡)。
    【解决方案2】:

    我最终将其添加到 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 仅用于视图控制器之间的转换,而且在我看来,我没有将嵌入式控制器视为一种转换。也许比我更博学的人(此时几乎是这里的任何人)可以解释这一切是如何结合在一起的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多