一、新建一个分类
二、导入分类头文件
三、需要拦截的地方实现方法 - (BOOL)navigationShouldPopTwo 即可
.h
#import <UIKit/UIKit.h> @protocol BackButtonHandlerProtocol <NSObject> @optional - (BOOL)navigationShouldPopTwo; @end @interface UIViewController (BackButtonHandler) <BackButtonHandlerProtocol> @end
.m
#import "UIViewController+BackButtonHandler.h" @implementation UIViewController (BackButtonHandler) @end @implementation UINavigationController (ShouldPopOnBackButton) //当控制器的Item需要pop的时候执行下面的方法(不管是手动返回,侧滑返回,代码pop都会调用下面方法) //返回YES,释放Item;返回NO,不释放当前Item - (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item { NSLog(@"pop kzhiq:%ld items:%ld",self.viewControllers.count,navigationBar.items.count); //控制器数小于Item数时,必须直接pop 掉 item if([self.viewControllers count] < [navigationBar.items count]) { return YES; } BOOL shouldPop = YES; UIViewController* vc = [self topViewController]; if ([vc respondsToSelector:@selector(navigationShouldPopTwo)]) { shouldPop = ![vc navigationShouldPopTwo];//这个方法里面执行了其他的pop操作 } if(shouldPop) {// dispatch_async(dispatch_get_main_queue(), ^{ [self popViewControllerAnimated:YES];//没有外部操作时,直接代码pop,这时 }); } return NO; } @end