【发布时间】:2015-06-17 09:33:48
【问题描述】:
我有一个容器视图,我弹出到我的情节提要中。有一个很棒的小箭头,代表嵌入到另一个场景的转场。该场景的顶级对象由自定义UIViewController 控制。我想调用在我的自定义类中实现的方法。如果我可以访问容器,我如何获得对里面内容的引用?
【问题讨论】:
标签: ios swift uicontainerview
我有一个容器视图,我弹出到我的情节提要中。有一个很棒的小箭头,代表嵌入到另一个场景的转场。该场景的顶级对象由自定义UIViewController 控制。我想调用在我的自定义类中实现的方法。如果我可以访问容器,我如何获得对里面内容的引用?
【问题讨论】:
标签: ios swift uicontainerview
您可以使用prepareForSegue(UIViewController 中的一个方法)来访问从当前视图控制器中被转接的任何UIViewController,这包括embed 转接。
来自关于prepareForSegue的文档:
这个方法的默认实现什么都不做。当您的视图控制器需要将相关数据传递给新的视图控制器时,它会覆盖此方法。 segue 对象描述了转换,并包括对 segue 中涉及的两个视图控制器的引用。
在您提到需要在自定义视图控制器上调用方法的问题中。以下是您如何做到这一点的示例:
1. 为您的嵌入 segue 提供一个标识符。您可以在 Interface Builder 中执行此操作,方法是选择您的 segue,转到 Attributes Editor 并查看 Storyboard Embed Segue。
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的类。例如:
现在一切都应该正常了。希望对您有所帮助!
【讨论】:
where segue.identifier == "EmbedSegue" 位,如果您有多个嵌入式控制器,您可能需要它,但只有一个,看起来您不需要不需要标识符。
ABaker 的回答为父母提供了一个了解孩子的好方法。要让子代码中的代码到达父节点,请使用 self.parent(或在 ObjC 中,parentViewController)。
【讨论】: