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

涉及的内容:

  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. [Code::Blocks] Install wxWidgets & openCV

    The open source, cross platform, free C++ IDE. Code::Blocks is a free C++ IDE built to meet the most ...

  2. sizeof()用法汇总【转载】

    转载自:http://www.cnblogs.com/chengxin1982/archive/2009/01/13/1374575.html 参考:http://blog.csdn.net/free ...

  3. 20套新鲜出炉的免费 PSD 格式的图标《免费下载》

    在网页设计中,设计师专注于每一个领域的设计,包括颜色选择.图标.创造力.混色等.正确的选择图标可以使他们的设计脱颖而出,看起来令人震惊.在 Web 设计领域,图标发挥非常重要的作用,因为美丽的和创造性 ...

  4. SQL Server 2016里TempDb的提升

    几个星期前,SQL Server 2016的最新CTP版本已经发布了:CTP 2.4(目前已经是CTP 3.0).这个预览版相比以前的CTP包含了很多不同的提升.在这篇文章里我会谈下对于SQL Ser ...

  5. ThroughRain第二次冲刺(每天更新

    第二次冲刺时间: 11月28-12月5号 第一次冲刺目标及分配: 1. 查询点餐界面         认领:梁仕标 2. 链接数据库            认领:冯梓凡 3. 建立数据库的表     ...

  6. P6 EPPM Installation and Configuration Guide 16 R1 April 2016

    P6 EPPM Installation and Configuration Guide 16 R1         April 2016 Contents About Installing and ...

  7. jQquery.validate自定义规则的使用案例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. MySQL架构

    一.MySQL逻辑架构         第一层,即最上一层,所包含的服务并不是MySQL所独有的技术.它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等.         ...

  9. Run python as a daemon process

    I am using `&`: why isn't the process running in the background?     No problem. We won't show y ...

  10. 平衡二叉树---Shaolin

    Description Shaolin temple is very famous for its Kongfu monks.A lot of young men go to Shaolin temp ...