如何在 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)界面的刷新是由哪个状态的改变导致的?
识别哪个 segue 触发了 UIViewController
如何使用来自另一个视图控制器swift的用户输入创建具有表视图单元格的列表