zoukankan      html  css  js  c++  java
  • 重写系统中的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 不会执行
    
    }
  • 相关阅读:
    第三周作业
    第二周作业
    计算机基础学习心得
    第三次作业
    第2次作业(指针总结)
    2018(上)C高级第0次作业
    本学期最后一次作业 总结。
    第十四、十五周作业
    第七周作业
    第六周作业
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5010322.html
Copyright © 2011-2022 走看看