iOS 7的新滑动手势“swipe-to-pop”对于UINavigationController
的视图控制器生命周期有何影响?
iOS 7的新滑动手势“swipe-to-pop”对于UINavigationController
的视图控制器生命周期有何影响?
UINavigationController
新增了从左向右滑动以执行返回操作的手势,称为“滑动返回”。需要注意的是,这个返回操作是可以取消的。在使用手势时,如果手势被中止,会触发viewWillAppear
和viewDidAppear
方法,与点击返回按钮的效果相同。无论手势是否成功,viewWillDisappear
方法都会被调用。请根据这些内容更新您的视图生命周期方法的期望值。需要注意的是,尽管用户中止了手势,viewWillDisappear
仍然会被调用。像我们所有人一样,在应用程序中平衡addObserver/removeObserver
调用以防止崩溃。我重写了视图控制器生命周期方法viewWillAppear/viewWillDisappear
来进行清理工作,并维护setupPerformed
标志,以防止在视图控制器的生命周期内添加观察者超过一次。此外,我还依赖于这个技巧来确定视图控制器即将从导航控制器的堆栈中弹出并随后释放,以便我知道何时精确地拆除我的观察者。
iOS 7使这种模式变得更加复杂。我不能再指望在调用viewWillDisappear
时销毁视图控制器。我必须预期它可能会转身,大喊“开玩笑”,然后继续调用viewWillAppear/viewDidAppear
。
很棒的帖子!
正如您所说,您不能再使用viewWillDisappear
和您描述的“技巧”,但是在iOS7上,这对我捕获返回按钮效果很好。
- (void)viewDidDisappear:(BOOL)animated
{
if (self.isMovingFromParentViewController == YES) {
// Do the tidy up as before....
}
}
我的情况略有不同。我正在自定义navigationController类中覆盖popViewControllerAnimated方法。在popViewControllerAnimated方法中,我能够检测到通过拖动进行的弹出操作。
self.interactivePopGestureRecognizer.state == UIGestureRecognizerStatePossible
viewWillAppear
会被调用,如果你取消了弹出操作,则分别调用viewWillDisappear
和viewDidDisappear
。 - James KuangviewWillAppear
视为 **viewMightAppear
**,将viewWillDisappear
视为 **viewMightDisappear
**。你可能不会在接收到viewWill...
调用之后立即收到相应的viewDid...
调用,对于当前视图控制器和堆栈中的前一个视图控制器都是如此。 - smileyborg