我有一个 ViewController,它包含一个 ContainerView。 因此,我为 ViewController() 添加了一个类,为 ContainerViews ViewController() 添加了一个类。为了更好地说明它,我附上了一张我的 storboard 场景的照片:
当我单击 ContainerView 中的按钮时,我想用不同的文本更新标签,我该如何实现?重要提示:ContainerViews 按钮是单独 ViewController 中的 IBAction,我想更新单独 ViewController() 类中的 IBOutlet。非常感谢您的帮助!!!
最佳答案
获取容器 View 中的父 View Controller 并将其转换为父 Controller 的类型(如 thefredelement 的评论)会起作用,但是它有一些缺点。
- 你的容器 View 应该是恰好是 MVC本身。作为一种观点,它不应该知道谁在控制它, 然而,它可能知道它有一个可以发送的委托(delegate) 消息到。例如 UITextView 是否知道它是一个 child 特定类别的 View Controller ?不,但它知道它可能 有一个可以向其发送消息的委托(delegate)。
- 您不能将此 View Controller 重用为任何其他 View Controller 的子级,因为它与父类紧密耦合
- 只需将接收到的父级转换为您父级的类型,您就可以绕过类型检查。
所以“快速修复”可能是按照评论中的建议去做,但是,我提供这个答案作为建议,因为我认为从长远来看应该如何处理这个问题。希望其他人觉得它有用。我知道经历整个思考过程对我很有帮助。
理想情况下,我认为您应该在 ContainerViewController 中声明一个变量,它要么是您的父 View Controller 的类,要么是您的父 Controller 将遵循的更好的协议(protocol)。然后在准备父 View Controller 的 segue 时,您将设置此变量。
与此同时,您的父级应该(或至少可以)将一个变量声明为您的容器 View 类型或容器将遵守的其他协议(protocol)。然后还在为父级的 segue 做准备时,获取 Container View Controller 的句柄并将其存储在您声明的变量中。
所以像这样:
在您的 ContainerViewController 中
var myContainerViewDelegate: ParentViewControllerOrProtocol
在你的父 View Controller 中
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 看起来像 View 对象(我认为它应该被认为是),而 myChildViewOutlet 变量是你到那个 View 的导出(它可能应该是弱的)。
容器中的 myContainerViewDelegate 引用实质上将您的父级设置为容器 View Controller 的委托(delegate)。
现在两个 View Controller 都有彼此的句柄
关于swift - 如何从 ContainerView 更新父 View /viewController 的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33512491/