从iOS7中的UINavigationController切换到弹出窗口时查看控制器生命周期

时间:2013-09-21 01:05:27

标签: uinavigationcontroller uigesturerecognizer ios7 lifecycle

iOS 7新的刷卡到手势的姿势对UINavigationController的视图控制器生命周期有什么影响?

3 个答案:

答案 0 :(得分:43)

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

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

  1. 用户点按后退按钮
  2. viewWillDisappear被称为
  3. viewDidDisappear被称为
  4. 弹出控制器已发布
  5. 完成滑动即可轻击后退按钮

    1. 用户开始从左向右滑动
    2. viewWillDisappear被称为
    3. 用户完成滑动手势
    4. viewDidDisappear被称为
    5. 弹出控制器已发布
    6. 取消了刷卡到弹出工作

      1. 用户开始从左向右滑动
      2. viewWillDisappear被称为
      3. 用户中止滑动手势(通过反转,或者不向右拖动足够远)
      4. viewWillAppear被称为
      5. viewDidAppear被称为
      6. 相应地更新您的期望和视图生命周期方法。

        值得注意的是,即使用户中止弹出手势,也会在所有案例中调用viewWillDisappear。这可能证明是谎言;如果刷卡到弹出的手势被中止,你的视图就不会消失,是吗?

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

        iOS 7使这种模式变得复杂。调用viewWillDisappear时,我无法再依赖视图控制器被拆除。我不得不期待它会转过身来,大喊“开玩笑”,然后再一次打电话给viewWillAppear/viewDidAppear

答案 1 :(得分:6)

很棒的帖子!

正如你所说,你不能再像你所描述的那样使用viewWillDisappear和'技巧',但是对于我来说,这对我来说非常适合捕获后退按钮。< / p>

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

希望这有助于某人。

答案 2 :(得分:0)

我的情况略有不同。我在自定义navigationController类中覆盖popViewControllerAnimated。在popViewControllerAnimated中,我能够在

时通过拖动检测到弹出
self.interactivePopGestureRecognizer.state == UIGestureRecognizerStatePossible