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

ste*_*her 26 lifecycle uinavigationcontroller uigesturerecognizer ios7

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

ste*_*her 43

iOS 7中的新功能是一种刷卡式的手势UINavigationController; 您可以从左向右滑动手指以执行通常使用后退按钮完成的操作.你需要注意的是,弹出过渡是可以取消的.

点击后退按钮仍然可以按照您的预期方式运行:

  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.

  • 此外,当您处于滑动(平移)的中间时,您的UINavigationController将接收对 - [UINavigationController popViewControllerAnimated:]的调用.但是当你通过反转来取消滑动(平移)时你将*不*调用 - [UINavigationController pushViewController:animated:] (5认同)
  • 另一件需要注意的是,相同的行为应用于您正在弹出的(父)视图控制器下面的(父)视图控制器.它一看就会调用`viewWillAppear`,如果取消pop,则分别调用`viewWillDisappear`和`viewDidDisappear`. (4认同)
  • 核心教训是:在iOS 7或更高版本中,将`viewWillAppear`视为**`viewMightAppear`**,将`viewWillDisappear`视为**`viewMightDisappear`**.在接收到`viewWill ...`调用后,对于当前视图控制器**和**堆栈中的前一个视图控制器**,您可能不会收到相应的`viewDid ...`调用. (4认同)
  • 哎呀!我同样删除了我的观察员. (2认同)

小智 6

好帖子!

正如你所说的那样,你不能再viewWillDisappear像你所描述的那样使用和'技巧'了,但是对于我来说,这在iOS7上可以很好地捕获后退按钮.

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

希望这有助于某人.