#import <UIKit/UIKit.h>
@protocol BackButtonHandlerProtocol <NSObject>
@optional
/**
重写下面的方法以拦截导航栏返回按钮点击事件,返回 YES 则 pop,NO 则不 pop
@return <#return value description#>
*/
-(BOOL)navigationShouldPopOnBackButton;
@end
@interface UIViewController (BackButtonHandler)<BackButtonHandlerProtocol>
@end
#import "UIViewController+BackButtonHandler.h"
@implementation UIViewController (BackButtonHandler)
@end
@implementation UINavigationController (ShouldPopOnBackButton)
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
if([self.viewControllers count] < [navigationBar.items count])
{
return YES;
}
BOOL shouldPop = YES;
UIViewController* vc = [self topViewController];
if([vc respondsToSelector:@selector(navigationShouldPopOnBackButton)])
{
shouldPop = [vc navigationShouldPopOnBackButton];
}
if(shouldPop)
{
dispatch_async(dispatch_get_main_queue(), ^{
[self popViewControllerAnimated:YES];
});
}
else
{
// 取消 pop 后,复原返回按钮的状态
for(UIView *subview in [navigationBar subviews])
{
if(0.0 < subview.alpha && subview.alpha < 1.0)
{
[UIView animateWithDuration:0.25 animations:^{
subview.alpha = 1.0;
}];
}
}
}
return NO;
}
@end
#import "UIViewController+BackButtonHandler.h"
//调用
- (BOOL)navigationShouldPopOnBackButton
{
[[[UIAlertView alloc] initWithTitle:@"提示" message:@"确定退出吗?" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil] show];
return NO;
}