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

标签 swift class button uiviewcontroller uicontainerview

我有一个 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/

相关文章:

ios - 如何在 MKPointAnnotation 中设置标识符

ruby-on-rails - 为什么我们在 ruby​​ 中用 @@ 作为类变量的前缀?

c# - WPF 按钮在连续 TapAndHold 时不显示工具提示

javascript - 如何从按钮列表中获取按钮的 ID?

Javascript:根据单击的按钮运行脚本

ios - 仅比较 Date 对象中的时差

swift - iOS 13 - 相机在 VNDocumentCameraViewController 中挂起

iphone - 当UI元素在iPhone中不可见时如何使用全宽?

python - 通过类内的 For 循环使用 linspace 进行迭代

属性名称为字符串的 C++ 对象输出