发生场景
在某个控制器里一旦修改了navigation 的 leftBarButtonItem, 像这样
self.navigationItem.leftBarButtonItem = leftBarButton;
就会导致滑动返回手势失效, 原因是修改 leftBarButtonItem 导致手势代理丢失, 解决办法如下:
在进入控制器时 viewWillAppear 中保存代理对象到一个全局变量 nvDelegate 中
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// 修改了 navigation 的 leftbarburron 导致滑动返回丢失, 需重新设置代理, 但根控制器不能有滑动返回手势
self.nvDelegate = self.navigationController.interactivePopGestureRecognizer.delegate;
self.navigationController.interactivePopGestureRecognizer.delegate = self;// 重新设置代理
}
在离开页面时, 把 nvDelegate 还原回 navigation 中, 叫做恢复现场
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// 修改了 navigation 的 leftbarburron 导致滑动返回丢失, 需重新设置代理, 但根控制器不能有滑动返回手势
self.navigationController.interactivePopGestureRecognizer.delegate = self.nvDelegate;
}
这样就解决了手势丢失问题, 快去试试吧
还有一个词很重要 --- 恢复现场,操作系统里面到处都用到 恢复现场 这种手段,比如做递归时,一层一层下去的时候,所有参数被保存在函数栈里,这个叫保护现场,回溯的时候,就要恢复现场啦,不然参数就不是原来的值了。
还有CPU上寄存器的数据,被优先级高的进程抢占的时候,寄存器的值会保存在内存里,等到可以运行时,在恢复现场,继续运行。
这个编程思想很重要。