文章目录
  1. 1. 文档更新说明
  2. 2. 前言
  3. 3. 必现条件
  4. 4. 解决方案

文档更新说明

  • 最后更新 2017年01月05日
  • 首次更新 2017年01月05日

前言

  这个问题的出现还真是挺有意思的,一开始以为是系统问题,后来经过同事反复操作,甚至还录下了视频😂 ,操作了N次后,最后终于定位了问题并解决了.
  具体现象就是某个界面点击之后偶尔会出现无法正确push界面,而是直接的卡死.

必现条件

  视图情况如下

TabViewController-> NavigationViewController-> TableViewController-> Push A-> Push B

  NavigationViewController为TabViewController的子视图之一,先Push A控制器,再Push B控制器,此时在B控制器中重写self.navigationItem.leftBarButtonItems,接着在视图viewDidAppear的时候设置返回手势的代理为如下:

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;

这样设置之后,因为自定义了leftBarButtonItems之后被系统取消的边缘右滑返回手势会重新开启.现在问题来了,当用户对B, A控制器pop操作之后,回到NavigationViewController时,navigationController.interactivePopGestureRecognizer.delegate会被设置为nil了.
  (这里有一个地方需要说明,在B控制器pop回A控制器时,navigationController.interactivePopGestureRecognizer.delegate会被自动重新设置为默认的_UINavigationInteractiveTransition对象,但是回到NavigationViewController时会被自动设置为nil)
  由于NavigationViewController的手势代理由原来用于实现动画功能的代理变成了nil,因此再次触发pop动画时,界面会卡死.从视频中也可以看到最后触发开始的前一个步骤是边缘右滑操作(要仔细看.)   

解决方案

1
2
3
4
//在TableViewController显示完毕之后,禁用pop手势.
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
//在TableViewController即将消失时,启用pop手势.
self.navigationController.interactivePopGestureRecognizer.enabled = YES;

  当然啦,上面是最简单的解决方案了.另一个更加通用的解决方案就是自己实现一个pop手势互交动画,这样也就没有系统pop动画引起的任何问题啦😄~

文章目录
  1. 1. 文档更新说明
  2. 2. 前言
  3. 3. 必现条件
  4. 4. 解决方案