嗨我有一个共同的视图C,它可以从A和B中呈现。我想改变视图C中的导航栏颜色相对于它所呈现的视图。假设C是从View中呈现的,那么我想让导航栏变为绿色,如果C是从View B中呈现的,那么我想让View C的导航栏变成红色。我无法弄清楚如何做到这一点。
有人可以帮我解决我面临的问题.....
提前致谢
答案 0 :(得分:4)
您应该通过向推送的视图控制器添加属性并在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
答案 1 :(得分:1)
在C视图控制器上, 获取导航堆栈中的所有视图控制器。
let controllers = self.navigationController.viewControllers
查找并检查此数组中第二个最后一个对象的A或B类型。
if controllers.count > 1, let expectedController = controllers[controllers.count-2] as? A {
// Your last controller was A type
}
答案 2 :(得分:0)
您可以按照以下代码进行检查
if let controllerA = self.navigationController?.presentingViewController as? ControllerA {
print("arrived from controllerA")
} else if let controllerB = self.navigationController?.presentingViewController as? ControllerB {
print("arrived from controllerB")
}
答案 3 :(得分:0)
我建议您可以为此设置一个枚举
enum transitionType {
case first
case second
}
然后只需在视图控制器“C”中为此枚举创建一个变量,例如
var pushedFrom = transitionType.first
然后你要做的就是在推送或呈现它之前创建viewcontroller C的对象时,只需提供具有正确值的“pushFrom”变量,例如,如果它来自viewcontroller A,
secondViewController.pushedFrom = .first
如果它的viewcontroller B,
secondViewController.pushedFrom = .second
然后在Viewcontroller“C”的viewDidLoad中,您可以检查pushfrom变量保存的情况,并相应地更改导航控制器颜色。