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

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

  1. iOS 机智的修改导航栏返回事件

    只需要一个在自定义的基类控制器的UIBarButtonItem,在需要的时候继承该类,实现selector方法即可(如果大部分处理都是一样的,只需在基类控制器内实现操作). self.navigati ...

  2. iOS 中导航控制器全屏向右滑动返回上一界面

    在iOS中,导航控制器默认就自带了侧滑功能,当用户在界面的左边(左边边缘)滑动的时候,才会有侧滑功能.但是我们往往在开发的过程中需要在屏幕的任意位置滑动,都需要返回到上一个界面. 多说无意,直接看代码 ...

  3. 8行代码教你搞定导航控制器全屏滑动返回效果 ————转载

    作者:@吖了个峥 前言 此次文章,讲述的是导航控制器全屏滑动返回效果,而且代码量非常少,10行内搞定. 效果如图: 如果喜欢我的文章,可以关注我,也可以来小码哥,了解下我们的iOS培训课程.陆续还会有 ...

  4. IOS设置导航栏返回按钮,并添加事件返回主页面

    IOS设置导航栏返回按钮,并添加事件返回主页面 前提是已经push了一个viewController了.才能使用. XXXTableViewController 里面书写 - (void)viewDi ...

  5. Swift之捕捉侧滑返回事件并跳转指定控制器

    捕捉侧滑返回事件 在当前控制器中重写以下两个方法即可: // OC - (void)willMoveToParentViewController:(nullable UIViewController ...

  6. ios 返回指定导航控制器

    方法 一:    [self.navigationControllerpopToViewController:[[HSYPersonalCenterController  alloc]init]ani ...

  7. html中单选按钮设置监听事件,浅谈监听单选框radio改变事件(和layui中单选按钮改变事件),单选框radio...

    浅谈监听单选框radio改变事件(和layui中单选按钮改变事件),单选框radio 若是只引用jquery的话,监听单选按钮改变事件如下: 男 女 $(document).ready(functio ...

  8. 从程序员打人事件谈一谈“产品经理”

    最近流传了一个某公司的程序员和产品经理打架的事情,在网上引起了一些话题,产品经理和程序员的矛盾几乎是不可调和的,我对这一问题的思考已经很久了,趁此机会也来谈一谈. 学软件工程的时候,有几种软件开发的模 ...

  9. ios开发返回按钮消失_iOS开发之自定义导航栏返回按钮右滑返回手势失效的解决...

    我相信针对每一个iOS开发者来说~除了根视图控制器外~所有的界面通过导航栏push过去的界面都是可以通过右滑来返回上一个界面~其实~在很多应用和APP中~用户已经习惯了这个功能~然而~作为开发者的我们 ...

最新文章

  1. [bzoj 4199][NOI 2015]品酒大会
  2. php的服务器变量$SERVER以及防止$_SERVER['PHP_SELF']造成的XSS漏洞攻击及其解决方案
  3. Single-Shot Object Detection with Enriched Semantics
  4. vue 固定div 滚动_vue移动端 导航吸顶(固定定位)页面滚动出现抖动
  5. Nginx七层负载均衡的案例
  6. MySQL 5.0-触发器
  7. ffplay的快捷键以及选项
  8. 嵌入式Linux系统的构成和启动总结
  9. 【python】类的封装、多态
  10. Springboot 之 自定义配置文件及读取配置文件
  11. 每个人都应该知道的Android Studio快捷方式
  12. 面向对象程序的设计模式
  13. JDK动态代理的使用,以及可以解决哪些问题和优点,什么是动态代理
  14. idea安装jclasslib和BindEd,以及使用
  15. nodejs 使用opencc 实现一个简体转台湾繁体的服务
  16. esp8266调用心知天气
  17. WC2021 菊蒻yxy的题解
  18. 泼冷水!为什么说机器学习在很多方面被高估了? | 精选
  19. 前途迷茫不知.NET与JAVA那个好
  20. 借助 PrivateLink 与 EMQX Cloud 建立安全可靠的连接

热门文章

  1. 基于Redis的分布式锁,Redisson的简单使用和常用配置
  2. hibernate 中 Provided id of the wrong type for class 异常
  3. 表示定理(representer theorem)
  4. calendar HOUR_OF_DAY 和 HOUR的区别
  5. R语言之实现Excel的数据透视功能
  6. 初识随机规划:用一个小例子理解随机规划
  7. canvas炫酷3d网页背景动画js特效
  8. datepicker 季度
  9. 时态1-----英语专升本
  10. 小米监控系统open-falcon搭建