如何在Swift中获取容器内的视图?

时间:2015-04-11 19:39:22

标签: ios swift uicontainerview

我有一个容器视图,我弹出了我的故事板。这是一个很棒的小箭头,代表着嵌入另一个场景。该场景的顶级对象由自定义UIViewController控制。我想调用一个在我的自定义类中实现的方法。如果我可以访问容器,我如何获得对内部内容的引用?

2 个答案:

答案 0 :(得分:89)

您可以使用prepareForSegue中的UIViewController方法访问当前视图控制器中正在搜索的任何UIViewController,其中包括embed个segues。

有关prepareForSegue的文档:

  

此方法的默认实现不执行任何操作。当需要将相关数据传递给新视图控制器时,视图控制器会覆盖此方法。 segue对象描述了转换,并包含对segue中涉及的两个视图控制器的引用。

在您的问题中,您提到需要在自定义视图控制器上调用方法。这是一个如何做到这一点的例子:

1。为您的embed segue添加标识符。您可以在界面生成器中选择segue,转到属性编辑器并查看 Storyboard Embed Segue

enter image description here

2。创建类似于:

的类

引用保留在embeddedViewController,以便稍后可以调用myMethod。它被声明为一个隐式展开的可选项,因为给它一个非零的初始值是没有意义的。

//  This is your custom view controller contained in `MainViewController`.
class CustomViewController: UIViewController {
    func myMethod() {}
}

class MainViewController: UIViewController {
    private var embeddedViewController: CustomViewController!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? CustomViewController,
                    segue.identifier == "EmbedSegue" {
            self.embeddedViewController = vc
        }
    }

    //  Now in other methods you can reference `embeddedViewController`.
    //  For example:
    override func viewDidAppear(animated: Bool) {
        self.embeddedViewController.myMethod()
    }
}

3. 使用 Identity Inspector 在IB中设置UIViewControllers的类。例如:

enter image description here

现在一切都应该有效。希望有所帮助!

答案 1 :(得分:11)

ABaker的回答为父母提供了一个了解孩子的好方法。要让孩子接触父母的代码,请使用self.parent(或在ObjC,parentViewController)。