我有一个UIViewController(我们称之为“EditViewController”),它上面有一个容器视图(称之为“ContainerView”),我切换进出各种子视图(调用我最关心的一个“EditDetailsView”) )。
从EditDetailsView我需要更改EditViewController导航栏中的标题。我似乎无法弄清楚如何引用它。
从EditViewController里面我可以简单地做一个语句:
self.title = @"Some new title";
它改变得很好。
但是从目前是ContainerView子视图的EditDetailsView视图中似乎没有任何工作:
self.title =
......显然是错误的。
super.title =
......不起作用,无论如何都是错误的。
super.super.title =
...错误输出为super不是UIViewController上的属性。
有人可以告诉我如何引用标题吗?我有点失落。
谢谢!
答案 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编程。