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

45

我有一个容器视图(Container View),我将其弹出到我的故事板中。那里有一个精美的小箭头,代表了嵌入式Segue到另一个场景。该场景的顶层对象由自定义UIViewController控制。我想调用在我的自定义类中实现的方法。如果我可以访问容器,如何获取内部的引用?

2个回答

109

您可以使用prepareForSegue方法在UIViewController中,以访问从当前视图控制器进行分段的任何UIViewController,包括embed分段。

根据prepareForSegue的文档:

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

在您的问题中,您提到需要在自定义视图控制器上调用一个方法。以下是如何实现的示例:

1. 为嵌入式分段设置标识符。您可以在Interface Builder中完成此操作,方法是选择您的segue,转到 Attributes Editor ,并查看 Storyboard Embed Segue 下方。

enter image description here

2. 创建类如下:

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

//  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. 在IB中使用Identity Inspector设置你的UIViewControllers的类。例如:

enter image description here

现在一切都应该工作了。希望这能帮到你!


prepareForSegue是从其他函数重写过来的吗? - Evan Conrad
1
这个方法很好用,但是我注意到我不需要 where segue.identifier == "EmbedSegue" 这一部分。如果你有多个嵌入的控制器可能需要它,但是只有一个的话,看起来不需要标识符。 - TaylorAllred

12

ABaker的回答提供了一个很好的方法,让父级了解孩子。为了让孩子中的代码可以访问父级,请使用self.parent(或在ObjC中使用parentViewController)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接