iOS 攔截導航欄返回按鈕事件(只攔截點選事件不改變系統按鈕樣式)
阿新 • • 發佈:2018-11-16
#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;
}