我试图弄清楚导航控制器的左边缘滑动和后退按钮行为之间的区别。我有一个只有在您通过左边缘滑动导航回来时才会出现的错误。如果按后退按钮,它可以正常工作。没有进行任何自定义来启用或禁用后退导航或手势导航。
我在这个主题上找到了令人惊讶的资源,我只是想更全面地了解每个事件触发的事件,以及它们的行为如何不同。
答案 0 :(得分:3)
这个错误是否一直表现出来,或者只有当你开始左边滑动并取消它时它才会显现出来?我问的原因是我们曾经编写的代码假定先前VC的viewWillAppear
和当前VC的viewWillDisappear
总是分别在viewDidAppear
和viewDidDisappear
之前。但是,交互式转换不再适用,因为在您开始转换时会调用viewWillAppear
/ Disappear
,但如果交互式转换,则相应的viewDidAppear
/ Disappear
可能不会过渡被取消。事实上,在WWDC 2013上介绍这个概念时,主持人开玩笑说他们应该将viewWillAppear
重命名为" viewMightAppear
,viewWillProbablyAppear
或iReallyWishThisViewWouldAppear
&#34 ;
因此,请查看您的viewWillAppear
和viewWillDisappear
方法,并确保您没有任何依赖于实际出现和消失的视图,因为如果手势被取消,你不会看到这些事件。
有关详细信息,请参阅WWDC 2013视频Custom Transitions Using View Controllers。交互式过渡在视频的一半左右进行了讨论。它讨论了如何实现自己的交互式过渡,但这些概念适用于导航控制器的内置左边滑动。
在标准" back"按钮进程,从第二个视图控制器弹出到第一个,事件序列是典型的:
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
中执行任何操作,请确保在取消交互式转换时再次调用该方法时您不会遇到问题。如果没有关于你在这些看似相关的方法中做了什么的信息,就不可能在你的情况下说出究竟是什么问题。
但最重要的是,你只需要确保应用程序没有做出任何假设,只是因为过渡开始,它必须完成。
答案 1 :(得分:0)
对于有此问题的任何人,如果有人要从导航堆栈中删除视图控制器或以其他任何方式更改它,请在viewDidAppear中执行这种逻辑,因为将该逻辑放置在其他位置会弄乱后退按钮并向左移动-完全向右滑动手势。将这种逻辑放在viewDidAppear中将解决您的问题。