如何检测在导航控制器的下一个视图控制器中按下后退按钮

Posted

技术标签:

【中文标题】如何检测在导航控制器的下一个视图控制器中按下后退按钮【英文标题】:How to detect back button is pressed in the next viewController in a navigationController 【发布时间】:2019-11-22 13:14:04 【问题描述】:

我想检测是否在导航控制器的下一个视图控制器中按下了后退按钮。 假设我在导航控制器中有 VC_A 和 VC_B 视图控制器。我知道如何检测当前视图控制器中是否按下了后退按钮,但我不知道如何在前一个视图控制器中检测它。

编辑:

我从 VC_A 转到 VC_B,当我按下 VC_B 中的返回按钮时,我想调用 VC_A 中的函数。

【问题讨论】:

我不明白。你能解释更多吗?或显示一些代码 如何按下当前不在窗口中的控制器的按钮?? 【参考方案1】:

您可以使用通知中心。这个链接有一个很好的教程:https://learnappmaking.com/notification-center-how-to-swift/

【讨论】:

【参考方案2】:

我想检测是否在导航控制器的下一个视图控制器中按下了后退按钮。

我不确定我是否完全理解这一点,但这并不重要:本质上,您正在谈论一些视图控制器(称为controllerA),其视图当前不可见,发现关于影响某些 other 视图控制器的更改 (controllerB)。需要这样的东西的通常原因是controllerA 可以更新它管理的一些数据。

更好的处理方法是让两个控制器共享一个公共数据模型。任何受视图控制器关闭等影响的应用程序状态都是共享数据,应该是数据模型的一部分。 controllerA 真的不应该关心 controllerB 的后退按钮是否被点击...该事件controllerB 的业务(可以说是管理它的导航控制器)。 controllerA 应该 关心的是根据屏幕外发生的任何变化更新自己的视图,这些变化应该由 controllerB 和任何其他可能的视图控制器记录在模型中一路走来一直很活跃。

【讨论】:

那么当我按下控制器B中的返回按钮并调用控制器A中的函数时,我可以使用委托方法吗? 委托是人们经常使用的一种模式,但使用共享数据模型可以说更好。如果两个控制器共享一个模型对象,那么它们都可以在调用自己的viewWillAppear 时更新自己,并在发生更改时更新模型,或者至少在调用viewWillDisappear 时更新模型。这样一来,他们就无需直接相互交谈,从而可以轻松地更改应用的某个部分,而不会影响其他部分。【参考方案3】:

我建议您使用 AglaiaZ 建议的通知中心来执行此操作。但是,如果您对使用通知中心感到不自在,那么请尝试使用 viewController 中的 viewWillAppear 委托方法的这个更基本的解决方案,您从中跟踪您是否从 B VC 回来。所以,我们走吧。

在当前视图控制器类中设置此变量,您希望在特定视图控制器上按下后退按钮时触发方法,让我们调用该特定视图控制器 B VC。

let isFromBViewController = false

然后在触发转换到 B VC 的代码块中,将此变量设置为 true。

func goToBViewController()  // This method is triggering transition from A VC to B VC
isFromBViewController = true 

然后在 viewWillAppear 委托方法中检查我们触发转换到 B VC 的当前 VC 是否从 B VC 出现。

override func viewWillAppear(_ animated: Bool) 
super.viewWillAppear(animated)

if isFromBViewController 
    // code for doing something when you got back from B VC

    isFromBViewController = false

就是这样。

但是,我再次建议您按照@AglaiaZ 的建议使用通知中心,该教程很简单,通过该教程,我还学习了如何使用通知中心以及如何创建和使用自定义通知。

祝你好运。

【讨论】:

【参考方案4】:

如果我理解正确,当按下当前视图控制器导航栏中的后退按钮,并且用户从当前 B 视图控制器返回到 A 视图控制器时,您想做一些事情。

将这行代码放在您想要跟踪用户按下后退按钮的视图控制器中。

override func viewWillDisappear(_ animated: Bool) 
    super.viewWillDisappear(animated)

    if isMovingToParent 
        //your code when back button is pressed
    

【讨论】:

感谢您的回答。我在 B 视图控制器中有一个后退按钮,当我按下它时,我想在 A 视图控制器中调用一个函数。 太好了,所以在这种情况下,B 视图控制器不应该对 A 视图控制器做任何事情。您有 2 个简单的解决方案,请查看来自@AglaiaZ 的关于通知中心的链接,一点也不复杂。或者只是在视图控制器 A 中的 viewWillAppear 委托方法中跟踪出现 VC 时是否来自 VC B。我将使用其他解决方案发布新答案。 听起来第二种方式是我需要的。提前谢谢。 检查我的新答案。

以上是关于如何检测在导航控制器的下一个视图控制器中按下后退按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何停止加载标签栏项目选择的视图?

使用导航控制器按下后退按钮后如何防止前一个片段显示?

按下后退按钮后,从另一个视图控制器更改按钮

使用导航控制器按下后退按钮后,如何防止先前的片段出现?

在android中按下后退按钮后如何返回相同的选项卡?

以编程方式调用 iOS 上的导航控制器后退按钮