我有一个容器视图,我弹出了我的故事板。这是一个很棒的小箭头,代表着嵌入另一个场景。该场景的顶级对象由自定义UIViewController
控制。我想调用一个在我的自定义类中实现的方法。如果我可以访问容器,我如何获得对内部内容的引用?
答案 0 :(得分:89)
您可以使用prepareForSegue
中的UIViewController
方法访问当前视图控制器中正在搜索的任何UIViewController
,其中包括embed
个segues。
有关prepareForSegue
的文档:
此方法的默认实现不执行任何操作。当需要将相关数据传递给新视图控制器时,视图控制器会覆盖此方法。 segue对象描述了转换,并包含对segue中涉及的两个视图控制器的引用。
在您的问题中,您提到需要在自定义视图控制器上调用方法。这是一个如何做到这一点的例子:
1。为您的embed segue添加标识符。您可以在界面生成器中选择segue,转到属性编辑器并查看 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
的类。例如:
现在一切都应该有效。希望有所帮助!
答案 1 :(得分:11)
ABaker的回答为父母提供了一个了解孩子的好方法。要让孩子接触父母的代码,请使用self.parent
(或在ObjC,parentViewController
)。