最近在工作中需要解决一个问题:
viewController需要捕获自己被导航控制器pop的事件,以及在自己被pop的时候处理一些事情。
在网上搜到的几乎全是用UIViewController+BackButtonHandler这种拦截控制器pop的文章,跟我的需求完全不一样,对于一个控制器是否已经被pop无法判断,网上找了好久居然找不到一个方法符合我的需求,于是自己想办法。
当控制器被pop时,导航控制器会走popViewControllerAnimated方法:
- (UIViewController *)popViewControllerAnimated:(BOOL)animated
于是把这件事告诉给需要知道自己被pop的controller,需要在popViewControllerAnimated里面做处理,有以下步骤:
1.自定义一个导航控制器继承自UINavigationController,一般项目里面都会有一个基导航控制器,在自定义的导航控制器里重写popViewControllerAnimated方法。
- (UIViewController *)popViewControllerAnimated:(BOOL)animated {
UIViewController *vc = self.topViewController;
if ([vc respondsToSelector:@selector(controllerWillPopHandler)]) {
[vc performSelector:@selector(controllerWillPopHandler)];
}
return [super popViewControllerAnimated:animated];
}
2.在需要捕获自己被导航控制器pop的控制器中实现这个方法:
- (void)controllerWillPopHandler {
NSLog(@"我被pop了");
// TODO
}
至此,目的已经实现了,不过以上代码在@selector(controllerWillPopHandler)处有警告,在这个自定义一个导航控制里实现这个方法,什么都不用做,警告就消除了。so easy,but it troubled me for a long time.
当然也可以定义一个block或代理,在popViewControllerAnimated里执行,但是我那个项目情况有点特殊,这两种方法在我项目里都不能用,前面那种方法最完美。
网友评论