如何从嵌入式容器视图的视图中引用视图控制器的标题?

时间:2014-01-04 04:22:45

标签: ios objective-c title uicontainerview

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

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

从EditViewController里面我可以简单地做一个语句:

self.title = @"Some new title";

它改变得很好。

但是从目前是ContainerView子视图的EditDetailsView视图中似乎没有任何工作:

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

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

super.super.title = ...错误输出为super不是UIViewController上的属性。

有人可以告诉我如何引用标题吗?我有点失落。

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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"
    }
}

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