谈一谈拦截导航控制器返回事件(上)——OPP

原创 2017年06月19日 10:43:37

iOS中,UINavigationController 是一个很好用的导航栏控制器,它可以很方便的控制controller 的显示,弹出。操作原理是一个栈,先进后出。
导航栏点击返回时, 会把刚压入栈的controller 弹出,这些已经封装好,不用我们做什么。但有时我们会有一个场景:比如我们填写一个表单时,用户点击了返回按钮,我们这时应该弹出提示,确定退出,但用户确定后,才pop 出这个controller。这时就需要我们拦截返回事件,通常做法就是在当前controller自定义返回按钮,这种做法最简单,但缺点也很明显:

1.每个需要拦截的controller都需要自定义按钮,造成代码冗余。
2.自定义的按钮与系统按钮样式有差别。

那我们这里利用OPP的思想,我们自己封装一个CustomizedNavigationController,继承于UINavigationController,扩展它的功能。CustomizedNavigationController 扩展的功能就是当 push 进来一个controller 时,给他们设置统一样式的返回按钮。所以我们在CustomizedNavigationController 重写:

-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated

继承父类行为的同时,也扩展相应的功能,添加自定义的返回按钮,拥有它的点击事件:

-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
    [super pushViewController:viewController animated:animated];

    [self setBackBarButtonItem:viewController];        
}

通过上面的方法,我们都所有push 进来的控制器统一的添加了返回按钮,但有的controller 需要拦截,有的controller 不需要拦截,这就需要controller 告诉我们,对于所有push 进来的控制器来说,这是一个统一的行为。所以我们需要一个父类拥有这个行为,那么他的子类也会继承父类这个行为,只不过每个子类的实现不同。

#import "BaseViewController.h"

@interface BaseViewController ()

@end

@implementation BaseViewController

-(BOOL)viewControllerShouldPop{
    return true;   //默认不拦截
}

需要拦截子类的实现:

#import "OPPInterceptViewController.h"

@interface OPPInterceptViewController ()

@end

@implementation OPPInterceptViewController
-(BOOL)viewControllerShouldPop{

   // 这里写 UIAlertController 询问用户  

    return NO;
}

但用户点击返回按钮时,执行 viewControllerShouldPop 方法,返回true,我们pop controller,返回false,不执行任何操作。

 if([viewController  viewControllerShouldPop]){ 
        [self popViewControllerAnimated:YES];
    }

效果如下:

这里写图片描述

面向对象编程中,我们在父类中定义了一个行为,然后他的子类也都拥有了此行为,不用我们每个子类中在定义一遍,不必造成代码冗余。我们也可以在子类中重写父类的方法,实现不同的功能。但缺点也很明显,从上面的例子我们可以看出:

1.我们必须使用自定义的NavigationController,如果我们不使用CustomizedNavigationController,就无法实现给controller设置自定义的返回按钮。
2.我们要想拥有 viewControllerShouldPop 这个行为时,必须要继承于 BaseViewController,如果controller 不继承于BaseViewController,但push 进来时,因找不到viewControllerShouldPop 方法,程序势必会崩溃。

这不我们不愿看到的。其实我们只想在push 这个点去执行一段我们自己的代码片段,难道只能重写父类的方法吗?
还好我们有AOP(面向切面编程),这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程

OK,那下章我们就来讨论一下如何用AOP实现上述功能。

源码:https://github.com/pzhtpf/CustomizedNavigationController

版权声明:本文为博主原创文章,未经博主允许不得转载。

谈一谈拦截导航控制器返回事件(下)——AOP

前文链接:谈一谈拦截导航控制器返回事件(上)——OPP我们开发一个项目都是慢慢完善的,设想一个很坏的情况:你所有的controller都没有基类,都是互相独立的。现在出现一个新的需求,当用户点击导航栏...
  • pzhtpf
  • pzhtpf
  • 2017年06月21日 16:59
  • 633

Android中View和ViewGroup事件分发拦截机制完美分析

出自:http://www.cnblogs.com/linjzong/p/4191891.html Touch事件分发中只有两个主角:ViewGroup和View。Activity的Touch事...
  • chenya866
  • chenya866
  • 2016年09月18日 11:39
  • 1462

简易的 WebView 拦截事件等

简易的 WebView 拦截事件等
  • antimage08
  • antimage08
  • 2015年12月08日 20:21
  • 2855

Android ViewGroup拦截触摸事件详解

在自定义ViewGroup中,有时候需要实现触摸事件拦截,比如ListView下拉刷新就是典型的触摸事件拦截的例子。触摸事件拦截就是在触摸事件被parent view拦截,而不会分发给其child,即...
  • bboyfeiyu
  • bboyfeiyu
  • 2014年10月01日 21:29
  • 13800

WindowManager中悬浮窗的返回键事件处理

今天在优化公司指纹应用锁时遇到了这样一个问题:指纹应用锁锁住应用界面如何监听返回键,处理点击事件?下面来分析一下这个问题。   首先介绍一下指纹应用锁逻辑,首先把要锁的应用保存到数据库,开启指纹应用...
  • xiaoxsen
  • xiaoxsen
  • 2017年06月15日 20:24
  • 2184

Android事件拦截机制分析

转载请注明出处: http://blog.csdn.net/qq347198688/article/details/52680091 本文出自【何嘉龙的博客】 1.引言当Android系统...
  • qq347198688
  • qq347198688
  • 2016年09月27日 13:46
  • 631

OPP面向思想个人认识

类与对象的基本认识 类         从生活中去理解类是生活中实体的共同点的集合,是以人的主观意识存在的。例如:飞机、大巴、的士它们的共同点都是载客运输它们都属于一个类。 对象    对象是任意一个...
  • mwlzj
  • mwlzj
  • 2016年02月29日 15:34
  • 466

拦截点击事件

1.如何寻找最合适的View? 主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件. 那如何找到最合适的View呢? 1.先判断自己是否能够接收触摸事件,如果能再继续往下判断...
  • wleleven
  • wleleven
  • 2016年11月21日 14:15
  • 252

Android进阶之事件拦截处理机制

1 Android控件架构1 简单的总结(1)父View优先拦截当前事件,拦截不成功就让子View对当前事件进行拦截。 (2)如果拦截成功的话,就会沿着子view到父View的路径查找onTouch...
  • chenliguan
  • chenliguan
  • 2016年08月19日 10:50
  • 950

Android 拦截返回键事件

介绍Android中拦截系统返回键事件的步骤和若干注意事项。
  • ccpat
  • ccpat
  • 2015年04月21日 21:34
  • 16961
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:谈一谈拦截导航控制器返回事件(上)——OPP
举报原因:
原因补充:

(最多只允许输入30个字)