【问题标题】:How to identify from which view controller we came from in Swift如何在 Swift 中识别我们来自哪个视图控制器
【发布时间】:2017-03-06 11:42:55
【问题描述】:

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

谁能给我一个解决我面临的问题的方法.....

提前致谢

【问题讨论】:

  • 从导航控制器获取 viewController 堆栈并检查其 A 或 B
  • 在 C innprepareForSegue 上设置一个属性,或者你推 C
  • 问题里有很多不好的东西......控制器不应该关心导航控制器的颜色,应该在外部设置。

标签: ios swift swift3 uinavigationcontroller uinavigationbar


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在您的 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
    }
    

    【讨论】:

      【解决方案3】:

      可以通过以下代码查看

       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")
      }
      

      【讨论】:

        【解决方案4】:

        我的建议是,您可以为此设置一个枚举

        enum transitionType {
            case first
            case second
        }
        

        然后只需在视图控制器“C”中为此枚举创建一个变量

        var pushedFrom = transitionType.first
        

        那么您所要做的就是在推送或呈现之前创建视图控制器 C 的对象时,只需为其“pushedFrom”变量提供正确的值,例如,如果它来自视图控制器 A,

        secondViewController.pushedFrom = .first
        

        如果它的视图控制器 B,

        secondViewController.pushedFrom = .second
        

        然后在 Viewcontroller "C" 的 viewDidLoad 中,你可以检查 pushfrom 变量持有什么情况,并相应地更改 navigationcontroller 颜色。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-06
          • 1970-01-01
          • 2015-06-19
          • 2013-09-19
          相关资源
          最近更新 更多