UINavigationController的左边缘滑动和后退按钮行为之间的差异

时间:2016-10-13 20:36:29

标签: ios cocoa-touch uinavigationcontroller gestures

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

我在这个主题上找到了令人惊讶的资源,我只是想更全面地了解每个事件触发的事件,以及它们的行为如何不同。

2 个答案:

答案 0 :(得分:3)

这个错误是否一直表现出来,或者只有当你开始左边滑动并取消它时它才会显现出来?我问的原因是我们曾经编写的代码假定先前VC的viewWillAppear和当前VC的viewWillDisappear总是分别在viewDidAppearviewDidDisappear之前。但是,交互式转换不再适用,因为在您开始转换时会调用viewWillAppear / Disappear,但如果交互式转换,则相应的viewDidAppear / Disappear可能不会过渡被取消。事实上,在WWDC 2013上介绍这个概念时,主持人开玩笑说他们应该将viewWillAppear重命名为" viewMightAppearviewWillProbablyAppeariReallyWishThisViewWouldAppear&#34 ;

因此,请查看您的viewWillAppearviewWillDisappear方法,并确保您没有任何依赖于实际出现和消失的视图,因为如果手势被取消,你不会看到这些事件。

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

在标准" back"按钮进程,从第二个视图控制器弹出到第一个,事件序列是典型的:

  • 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中执行任何操作,请确保在取消交互式转换时再次调用该方法时您不会遇到问题。如果没有关于你在这些看似相关的方法中做了什么的信息,就不可能在你的情况下说出究竟是什么问题。

但最重要的是,你只需要确保应用程序没有做出任何假设,只是因为过渡开始,它必须完成。

答案 1 :(得分:0)

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