嗨,我有一个 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

10-08 05:48