美文网首页IOSbugiOS_Dev_Tips实用集合
重写系统中的UINavigationController返回按钮

重写系统中的UINavigationController返回按钮

作者: 司马捷 | 来源:发表于2015-08-19 16:03 被阅读11084次

    1.扩展UIviewController
    UIViewController+BackButtonHandler.h

    #import <UIKit/UIKit.h>
    @protocol BackButtonHandlerProtocol <NSObject>
    @optional
    // Override this method in UIViewController derived class to handle 'Back' button click
    -(BOOL)navigationShouldPopOnBackButton;
    @end
    @interface UIViewController (BackButtonHandler) <BackButtonHandlerProtocol>
    @end
    

    UIViewController+BackButtonHandler.m文件

     #import "UIViewController+BackButtonHandler.h"
    
    @implementation UIViewController (BackButtonHandler)
    
    @end
    

    2.扩展UINavigationController ,也可以继承 使用

    @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 {
    // Workaround for iOS7.1. Thanks to @boliva - http://stackoverflow.com/posts/comments /34452906
    for(UIView *subview in [navigationBar subviews]) {
    if(subview.alpha < 1.) {
    [UIView animateWithDuration:.25 animations:^{
    subview.alpha = 1.;
    }];
    }
    }
    }
    
    return NO;
    }
    
    @end
    

    3.测试使用
    #import "ViewController.h
    #import "UIViewController+BackButtonHandler.h"

    @implementation ViewController
    
    -(void) viewDidLoad
    {
    [super viewDidLoad];
    self.title =  [NSString stringWithFormat:@"Screen-%d", self.navigationController.viewControllers.count];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Next" style:UIBarButtonItemStylePlain
     target:selfaction:@selector(onNextBtn:)];
    }
    
    -(void) onNextBtn:(id)sender
    {
    [self.navigationController pushViewController:[ViewController new] animated:YES];
    }
    
    -(BOOL) navigationShouldPopOnBackButton ///在这个方法里写返回按钮的事件处理
    {
    
    //这里写要处理的代码
     [self.navigationController popViewControllerAnimated:YES];
    return YES;//返回NO 不会执行
    
    }
    

    参考:http://blog.csdn.net/a330416020/article/details/41700821

    相关文章

      网友评论

      本文标题:重写系统中的UINavigationController返回按钮

      本文链接:https://www.haomeiwen.com/subject/tpkgqttx.html