我有一个ViewController,它包含一个ContainerView。
因此,我为ViewController()添加了一个类,为ContainerViews ViewController()添加了一个类。为了更好地说明它,我拍摄了我的storboard场景的照片:
当我单击ContainerView内的按钮时,我想用不同的文本更新Label,我该如何实现?重要说明:ContainerViews按钮是一个单独的ViewController中的IBAction,我想在单独的ViewController()类中更新IBOutlet。非常感谢你的帮助!!!
答案 0 :(得分:2)
在容器视图中获取父视图控制器并将其转换为父控制器的类型(如中所述) thefredelement的评论)将起作用,但它有一些缺点。
所以“快速修复”可能是按照评论中的建议来做的,但是,我提供这个答案作为一个建议,我认为从长远来看这应该被处理。希望其他人觉得它很有用。我知道对我来说,通过思考过程很有帮助。
理想情况下,我认为您应该在ContainerViewController中声明一个变量,该变量要么是父视图控制器的Class,要么是更好的父控制器将遵循的协议。然后在准备父视图控制器的segue时,您将设置此变量。
同时,您的父级应该(或至少可以)将变量声明为容器视图的类型或容器将遵循的其他协议。然后在准备父项的segue时,获取Container视图控制器的句柄并将其存储在您声明的变量中。
这样的事情:
在你的ContainerViewController
中var myContainerViewDelegate: ParentViewControllerOrProtocol
在父视图控制器中
weak var myChildViewOutlet: ChildViewControllerOrProtocol
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "embededSegueToChild" {
if let dvc = segue.destinationViewController.contentViewController as? ChildViewControllerOrProtocol {
dvc.myContainerViewDelegate = self
myChildViewOutlet = dvc
}
}
这样你的ContainerViewController看起来就像是视图对象(我认为它应该被认为是),而myChildViewOutlet变量是你视图的出口(可能应该是弱的)。
Container中的myContainerViewDelegate引用实际上将您的父设置为容器视图控制器的委托。
现在两个视图控制器都有一个彼此的句柄