28

iOS 7 新的 swipe-to-pop 手势对视图控制器生命周期的影响是UINavigationController什么?

4

3 回答 3

47

iOS 7 中的新功能是 ; 中的滑动弹出手势UINavigationController。您可以从左到右滑动手指来执行通常使用后退按钮完成的操作。您需要注意的是,pop 过渡是可取消的。

点击后退按钮仍然可以按您期望的方式工作:

  1. 用户点击后退按钮
  2. viewWillDisappear叫做
  3. viewDidDisappear叫做
  4. 弹出的控制器被释放

完成滑动弹出就像点击后退按钮

  1. 用户开始从左向右滑动
  2. viewWillDisappear叫做
  3. 用户完成滑动手势
  4. viewDidDisappear叫做
  5. 弹出的控制器被释放

取消的滑动弹出就像这样

  1. 用户开始从左向右滑动
  2. viewWillDisappear叫做
  3. 用户中止滑动手势(通过反转它,或者向右拖动不够远)
  4. viewWillAppear叫做
  5. viewDidAppear叫做

相应地更新您的期望和视图生命周期方法。

值得注意的是,在所有viewWillDisappear情况下都会调用它,即使用户中止了弹出手势。这可能被证明是谎言;如果滑动弹出手势被中止,您的视图不会消失,是吗?

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

iOS 7 复杂化了这种模式。我不能再依赖视图控制器在viewWillDisappear被调用时被拆除。我不得不期待它可能会转身,大喊“开个玩笑”,然后viewWillAppear/viewDidAppear再次打电话。

于 2013-09-21T01:05:26.697 回答
6

好帖子!

正如你所说,你不能再viewWillDisappear像你描述的那样使用 and 'trick',但是这对我来说在 iOS7 上可以很好地捕获 back button

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

希望这可以帮助某人。

于 2013-10-03T16:57:51.330 回答
0

我的情况略有不同。我在自定义 navigationController 类中覆盖 popViewControllerAnimated。在 popViewControllerAnimated 中,我能够检测到通过拖动发生的弹出

self.interactivePopGestureRecognizer.state == UIGestureRecognizerStatePossible
于 2015-09-23T21:18:31.797 回答