zoukankan      html  css  js  c++  java
  • 拦截UIViewController的popViewController事件

    实现拦截UIViewControllerpop操作有两种方式:

    • 自定义实现返回按钮,即设置UIBarButtonItem来实现自定义的返回操作。
    • 创建UINavigatonControllerCategory,来定制navigationBar: shouldPopItem:的逻辑。

    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
    
    @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(0. < subview.alpha && subview.alpha < 1.) {
    				[UIView animateWithDuration:.25 animations:^{
    					subview.alpha = 1.;
    				}];
    			}
    		}
    	}
    
    	return NO;
    }
    
    

    使用:

    • UIViewController当中引入头文件
    #import "UIViewController+BackButtonHandler.h"
    
    • UIViewController中实现navigationShouldPopOnBackButton方法。
    - (BOOL)navigationShouldPopOnBackButton{
        [[[UIAlertView alloc] initWithTitle:@"提示" message:@"确定返回上一界面?"
                                   delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil] show];
        //renturn no 拦截pop事件
        return NO;
    }
    

    参考:

  • 相关阅读:
    excel导入数据库表
    C# WinForm通过WebClient实现文件上传下载
    C#中的多线程——线程同步基础
    document.body.scrollTop为0的处理办法
    C#利用短信猫收发短信息的方法
    XML Serializable Generic Dictionary
    Making IE use PNG Alpha transparency
    String[3]: the Size property has an invalid size of 0.
    input style兼容IE6的方案
    安装window service 中出现Set Service Login对话框
  • 原文地址:https://www.cnblogs.com/coolwxb/p/6222620.html
Copyright © 2011-2022 走看看