开发中经常会遇到 点击导航栏返回按钮时不想 pop 回上一级控制器,而是回到 某一级控制器 或者需要在pop回去的时候回传一些数据,但查看文档发现,系统并没有给我们直接提供这样的方法。
那么我们先来分析如何获取返回按钮的点击事件。
返回按钮在导航栏上,所以我们先找到导航控制器UINavigationController的头文件,他有一个属性
@property(nonatomic,readonly) UINavigationBar *navigationBar;
我们知道返回按钮就在 navigationBar上,在看一下 UINavigationBar 的头文件,我们并没有发现有返回按钮的属性或者返回按钮的点击方法;
但是我们发现 navigationBar 有一个代理属性
@property(nullable,nonatomic,weak) id delegate;
查看 UINavigationBarDelegate 的方法中有一个方法是:
- (BOOL)navigationBar:(UINavigationBar )navigationBar shouldPopItem:(UINavigationItem )item; // same as push methods
哈哈,从方法名上我们已经看出这个方法就是我们要找的了!
由于navigationBar 是NavigationController的属性,我们推测 navigationBar 的 代理就是NavigationController, 于是我就在 NavigationController 里重写了上面那个代理方法,发现在点击返回按钮的时候,确实调用了这个方法,^^ 有没有觉得我们已经接近真相了 O(∩∩)O
等不及啦,直接上代码了
写一