您应该通过向推送的视图控制器添加一个属性并将其设置为 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