我有一个ViewController,它包含一个ContainerView.
因此,我为ViewController()添加了一个类,为ContainerViews ViewController()添加了一个类.为了更好地说明它,我拍摄了我的storboard场景的照片:
当我单击ContainerView内的按钮时,我想用不同的文本更新Label,我该如何实现?重要说明:ContainerViews按钮是一个单独的ViewController中的IBAction,我想在单独的ViewController()类中更新IBOutlet.非常感谢你的帮助!
最佳答案 获取容器视图中的父视图控制器并将其转换为父控制器的类型(如中所述)
thefredelement的评论)将起作用,但它有一些缺点.
>您的容器视图应该是恰好恰好的视图
一个MVC本身.作为一种观点,它不应该知道谁在控制它,
但是,它可能知道它有一个可以发送的代理
消息到.例如,UITextView知道它是一个孩子
一类特殊的视图控制器?不,但它知道它可能
有一个代表,它可以发送消息.
>您不能将此视图控制器重用为任何其他视图控制器的子视图,因为它与父类紧密耦合
>通过简单地将收到的父级转换为父级的类型,您将绕过类型检查.
因此,“快速修复”可能是按照评论中的建议进行的,但是,我提供这个答案作为一个建议,我认为从长远来看这应该被处理.希望其他人觉得它很有用.我知道对我来说,通过思考过程很有帮助.
理想情况下,我认为您应该在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引用实际上将您的父设置为容器视图控制器的委托.
现在两个视图控制器都有一个彼此的句柄