嗨,我有一个 public 视图C,可以从A和B两者中进行显示。我想相对于显示视图的视图更改视图C中的导航栏颜色。假设C是从View呈现的,那么我想使导航栏变成绿色,如果C是从View B呈现的,那么我想使View C的导航栏变成红色。我不知道该怎么做。
有人可以给我解决我所面临的问题的办法吗.....
提前致谢
最佳答案
您应该通过向推送的视图控制器添加属性,并在prepare(for segue:)
中进行设置来实现此目的
这样做的好处是ViewControllerC
不必假设哪个视图控制器呈现了它。这意味着您可以更改其呈现方式(可以模态化,而不是推送到导航堆栈上,或者由ViewControllerZ
推送),而无需更改其任何代码。
在ViewControllerC
中:
var navBarColor: UIColor?
override func viewWillAppear(_ animated: Bool) {
super viewWillAppear(animated)
navigationController?.navigationBar.barTintColor = navBarColor
}
然后在
ViewControllerA
中:override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vcc = segue.destination as? ViewControllerC {
vcc.navBarColor = .green
}
}
…并在
ViewControllerB
中:override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vcc = segue.destination as? ViewControllerC {
vcc.navBarColor = .red
}
}
额外信用
如果使用
.green
和.red
表示不同的“状态”,您可能会发现它对于属性表示该状态更为有用。举个例子…enum StoreState {
case buying, selling, browsing
var navBarColor: UIColor {
switch self {
case buying: return .green
case selling: return .red
case browsing: return .blue
}
}
var storeState: StoreState?
navigationController?.navigationBar.barTintColor = storeState?.navBarColor