iOS进阶之路iOS Developer

[记录] 解决 navigation 滑动返回手势丢失问题

2016-08-24  本文已影响0人  ck2016

发生场景

在某个控制器里一旦修改了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上寄存器的数据,被优先级高的进程抢占的时候,寄存器的值会保存在内存里,等到可以运行时,在恢复现场,继续运行。
这个编程思想很重要。

上一篇 下一篇

猜你喜欢

热点阅读