2

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

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

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

self.title = @"Some new title";

它改变得很好。

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

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

super.title =...不起作用,而且无论如何似乎都是错误的。

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

有人可以告诉我如何引用标题吗?我有点迷路了。

谢谢!

4

2 回答 2

0

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

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

于 2014-01-04T04:47:11.463 回答
0

我知道这是一个旧线程,但如果其他人需要它:为了避免使用委托的样板代码,并避免深入研究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"
    }
}

如果您熟悉 Reactive 编程,另一个避免使用委托过多代码的好方法是使用 RxSwift。

于 2017-09-05T14:34:02.400 回答