我试图找出导航 Controller 左边缘滑动和后退按钮行为之间的区别。我有一个错误,仅当您通过左边缘滑动向后导航时才会发生。如果按后退按钮,它会正常工作。没有进行任何自定义操作来启用或禁用后退导航或手势导航。
我发现关于这个主题的资源出人意料地少,我只是想更彻底地了解每个事件会触发哪些事件,以及它们在行为上有何不同。
最佳答案
此错误是否始终会出现,还是当且仅当您开始向左边缘滑动并取消它时才会出现?我问的原因是我们过去编写的代码假设 viewWillAppear
之前的 VC 和 viewWillDisappear
当前的总是先于 viewDidAppear
和viewDidDisappear
, 分别。但对于交互式过渡,情况不再如此,因为 viewWillAppear
/Disappear
当你开始转换时会被调用,但是相应的viewDidAppear
/Disappear
如果取消交互转换,则可能不会。事实上,在 WWDC 2013 上介绍这个概念时,主持人开玩笑说他们应该重命名 viewWillAppear
到“viewMightAppear
、或 viewWillProbablyAppear
、或 iReallyWishThisViewWouldAppear
”。
所以,看看你的viewWillAppear
和viewWillDisappear
方法,并确保那里没有任何依赖于 View 实际出现和消失的内容,因为如果取消手势,您将看不到这些事件。
有关更多信息,请观看 WWDC 2013 视频 Custom Transitions Using View Controllers 。视频的一半多一点讨论了交互式过渡。它讨论了如何实现您自己的交互式转换,但这些概念适用于导航 Controller 的内置左边缘滑动。
在标准的“后退”按钮过程中,从第二个 View Controller 弹出到第一个 View Controller ,事件顺序是典型的:
-
SecondViewController.viewWillDisappear
-
FirstViewController.viewWillAppear
-
SecondViewController.viewDidDisappear
-
FirstViewController.viewDidAppear
但是,如果您开始左边缘滑动手势并暂停,则事件顺序为:
-
SecondViewController.viewWillDisappear
-
FirstViewController.viewWillAppear
但是如果您停止手势并取消转换,则不会看到 SecondViewController.viewDidDisappear
和FirstViewController.viewDidAppear
,您将看到以下事件:
-
FirstViewController.viewWillDisappear
-
FirstViewController.viewDidDisappear
-
SecondViewController.viewWillAppear
-
SecondViewController.viewDidAppear
根据您在这些各种“出现”相关方法中所做的操作,如果操作不正确,您可能会遇到问题。例如,如果您正在 viewWillDisappear
中进行一些清理工作,确保您只清理在 viewWillAppear
中设置的内容。或者如果您在 viewDidAppear
中执行任何操作,确保在取消交互式转换的情况下再次调用该方法时不会出现问题。如果不了解您在这些与外观相关的方法中所做的操作,就不可能准确说出您的情况出了什么问题。
但最重要的是,您只需要确保应用程序不会做出任何假设,即仅仅因为转换开始,它就一定会完成。
关于ios - 导航 Controller 左边缘滑动和后退按钮行为之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40030510/