gpt4 book ai didi

swift - 如何从 ContainerView 更新父 View /viewController 的元素?

转载 作者:搜寻专家 更新时间:2023-10-31 19:34:27 24 4
gpt4 key购买 nike

我有一个 ViewController,它包含一个 ContainerView。因此,我为 ViewController() 添加了一个类,为 ContainerViews ViewController() 添加了一个类。为了更好地说明它,我附上了一张我的 storboard 场景的照片: enter image description here

当我单击 ContainerView 中的按钮时,我想用不同的文本更新标签,我该如何实现?重要提示:ContainerViews 按钮是单独 ViewController 中的 IBAction,我想更新单独 ViewController() 类中的 IBOutlet。非常感谢您的帮助!!!

最佳答案

获取容器 View 中的父 View Controller 并将其转换为父 Controller 的类型(如 thefredelement 的评论)会起作用,但是它有一些缺点。

  1. 你的容器 View 应该是恰好是MVC本身。作为一种观点,它不应该知道谁在控制它,然而,它可能知道它有一个可以发送的委托(delegate)消息到。例如 UITextView 是否知道它是一个 child 特定类别的 View Controller ?不,但它知道它可能有一个可以向其发送消息的委托(delegate)。
  2. 您不能将此 View Controller 重用为任何其他 View Controller 的子级,因为它与父类紧密耦合
  3. 只需将接收到的父级转换为您父级的类型,您就可以绕过类型检查。

所以“快速修复”可能是按照评论中的建议去做,但是,我提供这个答案作为建议,因为我认为从长远来看应该如何处理这个问题。希望其他人觉得它有用。我知道经历整个思考过程对我很有帮助。

理想情况下,我认为您应该在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com