谈一谈拦截导航控制器返回事件(上)——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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pzhtpf/article/details/73430912

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

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

swift自定义导航控制器返回按钮事件

最近在项目中碰到点击返回按钮时要先进行确认的需求,网上度了一下找到了相应的解决方案(代码下载地址:https://github.com/onegray/UIViewController-BackBut...
  • qingyou193301
  • qingyou193301
  • 2017年12月14日 10:05
  • 96

iOS 拦截导航的pop事件

iOS拦截导航栏返回按钮事件的正确方式 一、为 UINavigationController 添加 category 此方法来自 github:UIViewController-BackBut...
  • panxia1234
  • panxia1234
  • 2017年05月18日 17:06
  • 831

修改navigationController的返回按钮事件

在viewWillDisappear方法中判断是否进行了返回操作。 - (void)viewWillDisappear:(BOOL)animated {     [super viewW...
  • u014640208
  • u014640208
  • 2015年06月02日 10:17
  • 1720

Dialog运用与返回键的拦截.

新   浪                                                    淘  宝        开发中,会经常用dialog显示,可是对dialog 返回的...
  • jj120522
  • jj120522
  • 2012年07月04日 11:50
  • 3341

iOS自定义导航控制器侧滑返回的多种实现方法

*我们都知道,iOS7导航控制器默认自带了侧滑功能,当用户在界面的左边滑动的时候,就会有侧滑功能。 但是如果我们从从导航控制器的返回按钮,就发现系统所带的侧滑返回功能无法使用。因此为了解决此问题,有...
  • ai379558502
  • ai379558502
  • 2015年10月29日 14:11
  • 2827

Android拦截、监听系统返回键事件

Android拦截、监听系统级返回键事件 import android.app.Activity; public class MainActivity extends Activity ...
  • zhangphil
  • zhangphil
  • 2015年09月10日 10:55
  • 1881

js 控制 history 返回事件

我们拦截用户点击返回时,跳转到指定页面,而是来源页可以通过如下代码控制 window.onhashchange = function() { jp(); }; function hh() {...
  • jiangzeyin_
  • jiangzeyin_
  • 2018年01月28日 13:50
  • 110

iOS 拦截系统自带的Pop事件

首先,在开发中我遇到一个问题,用故事版将控制器连接起来,之后就有了系统自带的返回按钮(大家都知道,说的很直白)。 当我想点击返回按钮的时候,根据自己的情况再确定反不反回上一个控制器。解决方案: 我看到...
  • littleSun_zheng
  • littleSun_zheng
  • 2016年02月24日 13:07
  • 3999

Android AccessibilityService拦截事件及VR眼镜返回按键捕捉

公司项目有个需求,就是拦截VR眼镜上的返回按键,既然要拦截按键,私以为有以下两种方式: 1. AccessibilityService,Android辅助工具可以实现拦截按键、焦点变化、触摸时间、姿...
  • jasonwang18
  • jasonwang18
  • 2017年02月26日 15:25
  • 2026
收藏助手
不良信息举报
您举报文章:谈一谈拦截导航控制器返回事件(上)——OPP
举报原因:
原因补充:

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