• 重写系统中的UINavigationController返回按钮的事件


    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 不会执行
    
    }
  • 相关阅读:
    How to fix the error; 'Error: Bootstrap tooltips require Tether (http://github.hubspot.com/tether/)'
    CentOS 7.2安装教程
    webpack打包生成多个vendor的配置方法
    webpack务虚扫盲
    Webpack引入jquery及其插件的几种方法
    多线程Lock版生产者和消费者模式
    多线程共享全局变量以及锁机制
    多线程Thread类
    多线程threading模块
    Python正则表达式(二)
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5010322.html
Copyright © 2020-2023  润新知