如何识别我们来自Swift的视图控制器

时间:2017-03-06 11:42:56

标签: ios swift swift3 uinavigationcontroller uinavigationbar

嗨我有一个共同的视图C,它可以从A和B中呈现。我想改变视图C中的导航栏颜色相对于它所呈现的视图。假设C是从View中呈现的,那么我想让导航栏变为绿色,如果C是从View B中呈现的,那么我想让View C的导航栏变成红色。我无法弄清楚如何做到这一点。

有人可以帮我解决我面临的问题.....

提前致谢

4 个答案:

答案 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变量保存的情况,并相应地更改导航控制器颜色。