如何在 Swift 中识别我们来自哪个视图控制器

Posted

技术标签:

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

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

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

提前致谢

【问题讨论】:

从导航控制器获取 viewController 堆栈并检查其 A 或 B 在 C innprepareForSegue 上设置一个属性,或者你推 C 问题里有很多不好的东西......控制器不应该关心导航控制器的颜色,应该在外部设置。 【参考方案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 颜色。

【讨论】:

以上是关于如何在 Swift 中识别我们来自哪个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 如何快速识别视图(View)界面的刷新是由哪个状态的改变导致的?

如何检测哪个视图正在平移手势 Swift

识别哪个 segue 触发了 UIViewController

如何使用来自另一个视图控制器swift的用户输入创建具有表视图单元格的列表

如何在加载视图控制器之前使用来自服务器/数据库的数据来显示视图控制器

Swift ios 检查存在哪个视图控制器