【问题标题】:Differences between UINavigationController's Left Edge Swipe and Back Button behaviourUINavigationController 左边缘滑动和后退按钮行为之间的差异
【发布时间】:2017-02-23 03:20:09
【问题描述】:

我试图找出导航控制器的左边缘滑动和后退按钮行为之间的区别。我有一个错误,仅当您通过左边缘滑动导航返回时才会发生。如果按下返回按钮,它会正常工作。没有进行任何自定义来启用或禁用后退导航或手势导航。

我发现关于这个主题的资源非常少,我只想更彻底地了解每个事件触发了哪些事件,以及它们在行为上的不同之处。

【问题讨论】:

  • 将需要更多的细节,然后只是这个.. 究竟会发生什么?你觉得左边缘滑动和后退按钮有什么不同?你能显示一些与错误相关的代码吗(形成两个相关的视图控制器)
  • 其中一个区别是左边缘滑动是一种交互式过渡,例如用户可以控制速度和方向 - 后退和力量,也可以取消过渡,而点击后退按钮则不然。

标签: ios cocoa-touch uinavigationcontroller gestures


【解决方案1】:

对于遇到此问题的任何人,如果有人从导航堆栈中删除视图控制器或以任何其他方式更改它,请在 viewDidAppear 中执行此类逻辑,因为将该逻辑放在其他地方会弄乱后退按钮并离开- 完全向右滑动手势。将该逻辑放在 viewDidAppear 中将解决您的问题。

【讨论】:

    【解决方案2】:

    此错误是否一直出现,或者当且仅当您开始向左滑动并取消它时才会出现?我问的原因是,我们过去编写的代码假定先前 VC 的 viewWillAppear 和当前 VC 的 viewWillDisappear 总是分别位于 viewDidAppearviewDidDisappear 之前。但是对于交互式过渡不再是这样,因为当您开始过渡时将调用viewWillAppear/Disappear,但如果取消交互式过渡,则可能不会调用相应的viewDidAppear/Disappear。事实上,在 WWDC 2013 上介绍这个概念时,主持人开玩笑说他们应该将viewWillAppear 重命名为“viewMightAppear,或viewWillProbablyAppear,或iReallyWishThisViewWouldAppear”。

    所以,看看你的 viewWillAppearviewWillDisappear 方法,并确保你没有任何依赖于视图实际出现和消失的东西,因为如果取消手势,你赢了'看不到那些事件。

    有关详细信息,请参阅 WWDC 2013 视频Custom Transitions Using View Controllers。视频进行到一半多一点时讨论了交互式过渡。它讨论了如何实现您自己的交互式转换,但这些概念适用于导航控制器的内置左边缘滑动。


    在标准的“后退”按钮过程中,从第二个视图控制器弹出到第一个,事件顺序是典型的:

    • SecondViewController.viewWillDisappear
    • FirstViewController.viewWillAppear
    • SecondViewController.viewDidDisappear
    • FirstViewController.viewDidAppear

    但如果您开始向左滑动手势并暂停,则事件顺序为:

    • SecondViewController.viewWillDisappear
    • FirstViewController.viewWillAppear

    但如果您停止手势并取消转换,而不是看到 SecondViewController.viewDidDisappearFirstViewController.viewDidAppear,您将看到以下事件:

    • FirstViewController.viewWillDisappear
    • FirstViewController.viewDidDisappear
    • SecondViewController.viewWillAppear
    • SecondViewController.viewDidAppear

    根据您在这些各种“出现”相关的方法中所做的事情,如果没有正确完成,您可能会遇到问题。例如,如果您在 viewWillDisappear 中进行一些清理,请确保您只清理您在 viewWillAppear 中设置的内容。或者,如果您在 viewDidAppear 中执行任何操作,请确保在取消交互式转换后再次调用该方法时不会出现问题。如果没有有关您在这些与外观相关的方法中所做的操作的信息,就不可能说出您的情况到底出了什么问题。

    但最重要的是,您只需要确保应用不会做出任何假设,即仅仅因为过渡开始,它就一定会结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多