导航栏pop拦截

一、新建一个分类

二、导入分类头文件

三、需要拦截的地方实现方法   - (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
 
原文地址:https://www.cnblogs.com/sunjianfei/p/7808917.html