iOS7中从UINavigationController侧滑返回时的视图控制器生命周期

29

iOS 7的新滑动手势“swipe-to-pop”对于UINavigationController的视图控制器生命周期有何影响?

3个回答

48
iOS 7中导航控制器UINavigationController新增了从左向右滑动以执行返回操作的手势,称为“滑动返回”。需要注意的是,这个返回操作是可以取消的。在使用手势时,如果手势被中止,会触发viewWillAppearviewDidAppear方法,与点击返回按钮的效果相同。无论手势是否成功,viewWillDisappear方法都会被调用。请根据这些内容更新您的视图生命周期方法的期望值。需要注意的是,尽管用户中止了手势,viewWillDisappear仍然会被调用。

像我们所有人一样,在应用程序中平衡addObserver/removeObserver调用以防止崩溃。我重写了视图控制器生命周期方法viewWillAppear/viewWillDisappear来进行清理工作,并维护setupPerformed标志,以防止在视图控制器的生命周期内添加观察者超过一次。此外,我还依赖于这个技巧来确定视图控制器即将从导航控制器的堆栈中弹出并随后释放,以便我知道何时精确地拆除我的观察者。

iOS 7使这种模式变得更加复杂。我不能再指望在调用viewWillDisappear时销毁视图控制器。我必须预期它可能会转身,大喊“开玩笑”,然后继续调用viewWillAppear/viewDidAppear


2
哎呀!我也是以类似的方式移除我的观察者。 - HalR
6
此外,当您正在进行滑动(pan)时,您的UINavigationController将会收到一个调用-[UINavigationController popViewControllerAnimated:]。但是,当您通过反向滑动来取消滑动(pan)时,您将不会收到-[UINavigationController pushViewController:animated:]的调用。 - mamills
4
另一个需要注意的是,相同的行为也适用于你要弹出的视图控制器下面的(父级)视图控制器。当它露出来时,viewWillAppear会被调用,如果你取消了弹出操作,则分别调用viewWillDisappearviewDidDisappear - James Kuang
4
核心教训是:在 iOS 7 或更高版本上,将 viewWillAppear 视为 **viewMightAppear**,将 viewWillDisappear 视为 **viewMightDisappear**。你可能不会在接收到 viewWill... 调用之后立即收到相应的 viewDid... 调用,对于当前视图控制器和堆栈中的前一个视图控制器都是如此。 - smileyborg
好问题,@NickPodratz!你应该将其作为一个单独的问题提出来。 - steveluscher
显示剩余3条评论

6

很棒的帖子!

正如您所说,您不能再使用viewWillDisappear 和您描述的“技巧”,但是在iOS7上,这对我捕获返回按钮效果很好。

- (void)viewDidDisappear:(BOOL)animated
{
  if (self.isMovingFromParentViewController == YES) {
    // Do the tidy up as before....
  }
}

希望这能帮助到某些人。

0

我的情况略有不同。我正在自定义navigationController类中覆盖popViewControllerAnimated方法。在popViewControllerAnimated方法中,我能够检测到通过拖动进行的弹出操作。

self.interactivePopGestureRecognizer.state == UIGestureRecognizerStatePossible

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接