• 重写系统中的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 不会执行
    
    }
    
    参考:http://blog.csdn.net/a330416020/article/details/41700821
  • 相关阅读:
    Access Update 不支持子查询 用查询解决
    vs2005中文乱码
    清理sql日志
    VS2005快捷键使用
    如何用C#改文件名
    C#中使用DirectSound录音
    VS2005打包 到没有.NETFramework2.0的目标机器上安装
    Access中iif,isnull的用法
    水晶报表切换字段视图不能用的问题。
    VS2005中TextBox的ReadOnly属性
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5011001.html
Copyright © 2020-2023  润新知