【问题标题】:How do I refer to the title of a view controller from an embedded container view's view?如何从嵌入式容器视图的视图中引用视图控制器的标题?
【发布时间】:2014-01-21 21:38:22
【问题描述】:

我有一个 UIViewController(我们称之为“EditViewController”),上面有一个容器视图(称之为“ContainerView”),我在其中切换各种子视图(称之为我最关心的“EditDetailsView” )。

从 EditDetailsView 我需要更改 EditViewController 导航栏中的标题。我似乎无法弄清楚如何引用它。

从 EditViewController 内部我可以简单地做出如下声明:

self.title = @"Some new title";

它改变得很好。

但从当前是 ContainerView 子视图的 EditDetailsView 视图看来,似乎没有任何效果:

self.title = ... 显然是错误的。

super.title = ... 不起作用,而且似乎还是错了。

super.super.title = ... 出错,因为 super 不是 UIViewController 上的属性。

谁能告诉我如何引用标题?我有点迷路了。

谢谢!

【问题讨论】:

    标签: ios objective-c title uicontainerview


    【解决方案1】:

    虽然挖掘parentViewController 链是可能的,但它容易出错且不推荐。它被认为是一个糟糕的设计。想象一下,您以某种方式设置了视图控制器层次结构,但几个月后对其进行了一些更改,现在有了更深的层次。或者,您想在几个不同的场景中使用相同的视图控制器。更好的设计是使用委托将新标题传递给容器视图控制器。创建一个委托协议,带有设置标题的方法。

    - (void)childViewController:(ChildViewController*)cvc didChangeToTitle:(NSString*)title;

    【讨论】:

      【解决方案2】:

      我知道这是一个旧线程,但如果其他人需要它:为了避免使用 delegation 的样板代码,并避免深入研究parentViewController,我采用了相反的方式。

      我从父级引用了子视图控制器并获得了它们的标题。所以无论你展示哪个孩子,你总能得到正确的标题。

      这是在 Swift 3 中。

      所以,基本上,这是你的父母:

      class EditViewController: UIViewController {
          override func viewDidLoad() {
              if let child = self.childViewControllers.first {
                  self.title = child.title
              }
          }
      }
      

      这是你的孩子:

      class ContainerView: UIViewController {
          override func viewDidLoad() {
              self.title = "Sbrubbles"
          }
      }
      

      另一个避免使用委托过多代码的好方法是使用 RxSwift,如果你熟悉响应式编程的话。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-10
        • 2017-12-13
        • 2015-04-16
        • 2016-12-20
        • 2018-03-09
        • 2017-09-17
        • 1970-01-01
        相关资源
        最近更新 更多