前言;本文篇幅不多,但是涉及到的内容却是开发中常用的。

涉及的内容:

  1、统一设置导航控制器子控制器的返回按钮。

  2、因为修改了系统的返回按钮,所以还需要设置手势事件。

  3、隐藏底部的工具条。

这里直接给出.m的实现文件,.h文件不需要,因为没有属性,没有自定义公开的方法。

 #import "YMNavigationController.h"

 @interface YMNavigationController () <UIGestureRecognizerDelegate>

 @end

 @implementation YMNavigationController
#pragma mark - 当前控制器的 生命周期方法
-(void)viewDidLoad{
// 设置屏幕手势事件监听的代理对象是self
self.interactivePopGestureRecognizer.delegate = self;
} #pragma mark - 重写父类的UINavigationController的方法
/**
* 重写push方法的目的:拦截所有push进来的子控制器
*
* @param viewController 刚刚push进来的子控制器
*
* 通过storyboard拖线push或者用纯代码push进来都会调用下面这个方法
*/
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
// 如果viewController不是最早push进来的子控制器
// 这么去思考,返回按钮是属于上一个控制器的,点击返回按钮,回到上一个控制器嘛
// 返回按钮不是属于当前显示的控制器的
// 所以设置返回按钮的控制器就是从第1个子控制器开始的,也就是下面的>0的判断写法
if (self.childViewControllers.count > ) { // 处理左上角的返回按钮
UIButton* backButton = ({
UIButton* backButton = [UIButton buttonWithType:UIButtonTypeCustom];
//hy:这里需要设置按钮的image,根据需求不需要设置title
[backButton setImage:[UIImage imageNamed:@""] forState:UIControlStateNormal];
[backButton setImage:[UIImage imageNamed:@""] forState:UIControlStateHighlighted];
[backButton setTitle:@"返回" forState:UIControlStateNormal];
[backButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[backButton setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[backButton sizeToFit];// 图片自动适应按钮大小
//hy:然后这里设置按钮的内边距的偏移量 (上,左,下,右) 需要按照需求去改改
backButton.contentEdgeInsets = UIEdgeInsetsMake(, -, , );
[backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
backButton;
}); // 将上面这个自定义的按钮设置到导航控制器的返回按钮上
viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
// 隐藏底部的工具条
viewController.hidesBottomBarWhenPushed = YES;
}
// 上面设置搞定后,再push控制器显示出来
[super pushViewController:viewController animated:YES];
} #pragma mark - <UIGestureRecognizerDelegate>
/**
* 手势识别对象会调用这个代理方法来决定手势是否有效
*
* @return YES : 手势有效, NO : 手势无效
*/
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
// 当前,导航控制器的子控制器有2个以上的时候,手势有效。
return self.childViewControllers.count > ;
} #pragma mark - 按钮监听的方法
// 导航控制器返回按钮监听的方法
-(void)back{
[self popViewControllerAnimated:YES];
} @end

另外补充一个开发小细节,先看到上面的代码第47~48两行,也就是下面图中的第55~56行:

因为IOS开发是经常用懒加载的思想,所以在这个push方法被调用之前,如果使用了ViewController的view的属性或者和view相关的属性,就是调用ViewController的viewDidLoad方法。

也就是说,如果外部在push方法之前,就调用了ViewController的一些方法,比如setBackground,就会提前加载viewDidLoad以及里面的代码,然后调用push方法就会调用上面重写的UINavigationController的push方法,这样这重写push方法里面的设置会覆盖掉之前viewDidLoad里面的代码设置。

但是,如果把外部调用了ViewController的一些方法,比如setBackground,都放在viewDidLoad方法里面,就会出现,因为在调用push方法之前没有调用相关的view属性或者view方法,懒加载导致ViewController暂时没有调用viewDidLoad方法,所以就去执行上面重写的push方法,最后到了第56行(上面截图),将ViewController传递给pushViewController方法,底层显然会使得调用viewDidLoad方法,这时候viewDidLoad方法会被执行。

IOS开发之功能模块--自定义导航控制器类常用自定义的代码的更多相关文章

  1. IOS开发之功能模块--自定义UITabBarViewController的备用代码

    前言:因为常用,所以我就备份到这里,然后如果需要修改,可以根据需求进行相关的更改. @implementation YMTabBarController - (void)viewDidLoad { [ ...

  2. IOS开发之功能模块--给任意的UIView添加点击事件

    前言:好久没写博客,今天来一波.我在实际项目开发中,会遇到这样功能需求:我已经搭好了iOS的UI界面,但是很多界面的子View用了UIView,然后这些UIView中用了UILabel和UIImage ...

  3. iOS开发之功能模块--高仿Boss直聘的常用语的开发

    首先上Boss直聘的功能界面截图,至于交互请读者现在Boss直聘去交互体验:     本人的公司项目要高仿Boss直聘的IM常用语的交互功能,居然花费了我前后17个小时完成,这回自己测试了很多遍,代码 ...

  4. iOS开发之功能模块--关于自定义TabBar条

    只上项目中用到的代码: 1.实现重写TabBar的TabBarItem,然后在中间额外加一个按钮. #import <UIKit/UIKit.h> @interface BikeTabBa ...

  5. iOS开发之功能模块--Apns推送中的的json格式介绍

    在开发向苹果Apns推送消息服务功能,我们需要根据Apns接受的数据格式进行推送.下面接受我在进行apns推送时候总结的一点apns服务接受的Json数据格式 示例 1: 以下负载包含哦一个简单的 a ...

  6. iOS开发之功能模块--根据需求开发横向的子弹盒View

    这个需求是本人工作开发中后期需求要添加的新功能,本人模仿UITableView的代理和数据源方法进行了第一阶段的开发.第二阶段是添加丰富的动画. 这个功能需求描述:能上传添加五个待选头像,五个头像分别 ...

  7. iOS开发之功能模块--推送之坑问题解决

    不管想不想看我后面再开发中总结的经验,但是很值得推荐一位大神写的关于苹果推送,很多内容哦:http://www.cnblogs.com/qiqibo/category/408304.html 苹果开发 ...

  8. iOS开发之功能模块--高仿Boss直聘的IM界面交互功能

    本人公司项目属于社交类,高仿Boss直聘早期的版本,现在Boss直聘界面风格,交互风格都不如Boss直聘以前版本的好看. 本人通过iPhone模拟器和本人真机对聊,将完成的交互功能通过Mac截屏模拟器 ...

  9. iOS开发之功能模块--本地序列化

    下面只展示项目开发中,本地序列化的示例代码: AuthenticationManager.h #import <Foundation/Foundation.h> #import " ...

随机推荐

  1. IP Failover Setup using Keepalived on CentOS/Redhat 6

    source url:http://tecadmin.net/ip-failover-setup-using-keepalived-on-centos-redhat-6/ Keepalived is ...

  2. Robot Framework自动化测试(五)--- 开发系统关键字

    最近一直在用robot framework 做自动化测试项目,老实说对于习惯直接使用python的情况下,被框在这个工具里各种不爽,当然,使用工具的好处也很多,降低了使用成本与难度:当然,在享受工具带 ...

  3. Pagekit – 现代化技术构建的轻量的 CMS 系统

    Pagekit 是一个模块化,轻量的 CMS 系统,基于现代化的技术,如 Symfony 组件和 Doctrine.它提供了一个很好的平台,用于主题和延伸开发.Pagekit 为您提供了工具来创造美丽 ...

  4. vim编辑器的基本使用

        VIM的操作模式     Command Mode 命令模式     Insert Mode 输入模式     Last Line Mode 底行模式       vim abc 如果文件存在 ...

  5. PEP8 Python 编码规范

    一 代码编排1 缩进.4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格.2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号.换行点要在操作符的后边敲回车.3 类 ...

  6. SerializationUtility

    public static T LoadFromXml<T>(string fileName) { FileStream fs = null; try { XmlSerializer se ...

  7. 利用session做国际化引起的old区内存爆满及修复方法

    题记:昨天加班打车回家,看见前面有辆路虎在高速上开的巨慢,挡住了我坐的出租车的路,于是就跟司机吐槽了一句:“前面这车怎么这么面啊?”,司机沉默了大概3秒,说了一句富含哲理性的话:“没有面车,只有面人” ...

  8. 数论 - 欧拉函数的运用 --- poj 3090 : Visible Lattice Points

    Visible Lattice Points Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5636   Accepted: ...

  9. 有关CLR的初学小整理(可能理解不深刻,望大牛指出)

    1. .Net程序通过CLR去加载运行管理代码, 加载CLR的进程成为“宿主”,通常操作系统加载. 加载CLR的进程也可以为某个DLL,也成为“宿主” 2. 宿主接口使宿主能够对运行库的更多方面进行控 ...

  10. KTV点歌系统

    经过十多天的艰苦奋战,MyKTV点歌系统终于成型,从刚开始接到项目的茫然,到完成项目时的喜悦,整个过程的艰辛和付出只有自己知道.虽然这个项目还有许多需要完善的地方,譬如添加歌词信息,实现窗体的美化等, ...