【问题标题】: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 中的函数。

【问题讨论】:

  • 我不明白。你能解释更多吗?或显示一些代码
  • 如何按下当前不在窗口中的控制器的按钮??

标签: ios swift uinavigationcontroller


【解决方案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。我将使用其他解决方案发布新答案。
      • 听起来第二种方式是我需要的。提前谢谢。
      • 检查我的新答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多