我有一个容器视图(Container View),我将其弹出到我的故事板中。那里有一个精美的小箭头,代表了嵌入式Segue到另一个场景。该场景的顶层对象由自定义UIViewController
控制。我想调用在我的自定义类中实现的方法。如果我可以访问容器,如何获取内部的引用?
我有一个容器视图(Container View),我将其弹出到我的故事板中。那里有一个精美的小箭头,代表了嵌入式Segue到另一个场景。该场景的顶层对象由自定义UIViewController
控制。我想调用在我的自定义类中实现的方法。如果我可以访问容器,如何获取内部的引用?
您可以使用prepareForSegue
方法在UIViewController
中,以访问从当前视图控制器进行分段的任何UIViewController
,包括embed
分段。
根据prepareForSegue
的文档:
此方法的默认实现不执行任何操作。当您的视图控制器需要将相关数据传递到新的视图控制器时,该视图控制器会覆盖此方法。分段对象描述了转换,并包括对分段中涉及的两个视图控制器的引用。
在您的问题中,您提到需要在自定义视图控制器上调用一个方法。以下是如何实现的示例:
1. 为嵌入式分段设置标识符。您可以在Interface Builder中完成此操作,方法是选择您的segue,转到 Attributes Editor ,并查看 Storyboard Embed Segue 下方。
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
的类。例如:
现在一切都应该工作了。希望这能帮到你!
ABaker的回答提供了一个很好的方法,让父级了解孩子。为了让孩子中的代码可以访问父级,请使用self.parent
(或在ObjC中使用parentViewController
)。
where segue.identifier == "EmbedSegue"
这一部分。如果你有多个嵌入的控制器可能需要它,但是只有一个的话,看起来不需要标识符。 - TaylorAllred