1. 程式人生 > >iOS 攔截導航欄返回按鈕事件(只攔截點選事件不改變系統按鈕樣式)

iOS 攔截導航欄返回按鈕事件(只攔截點選事件不改變系統按鈕樣式)

#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;
}