IOS开发之功能模块--自定义导航控制器类常用自定义的代码

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

涉及的内容:

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

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

  3、隐藏底部的工具条。

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

 1 #import "YMNavigationController.h"  2  3 @interface YMNavigationController () <UIGestureRecognizerDelegate>
 4  5 @end  6  7 @implementation YMNavigationController
 8 #pragma mark - 当前控制器的 生命周期方法
 9 -(void)viewDidLoad{
10 // 设置屏幕手势事件监听的代理对象是self 11 self.interactivePopGestureRecognizer.delegate = self;
12 }
13 14 #pragma mark - 重写父类的UINavigationController的方法
15 /**
16  * 重写push方法的目的:拦截所有push进来的子控制器
17  *
18  * @param viewController 刚刚push进来的子控制器
19  *
20  * 通过storyboard拖线push或者用纯代码push进来都会调用下面这个方法
21 */ 22 -(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
23 // 如果viewController不是最早push进来的子控制器
24 // 这么去思考,返回按钮是属于上一个控制器的,点击返回按钮,回到上一个控制器嘛
25 // 返回按钮不是属于当前显示的控制器的
26 // 所以设置返回按钮的控制器就是从第1个子控制器开始的,也就是下面的>0的判断写法 27 if (self.childViewControllers.count > 0) {
28 29 // 处理左上角的返回按钮 30 UIButton* backButton = ({
31 UIButton* backButton = [UIButton buttonWithType:UIButtonTypeCustom];
32 //hy:这里需要设置按钮的image,根据需求不需要设置title 33 [backButton setImage:[UIImage imageNamed:@""] forState:UIControlStateNormal];
34 [backButton setImage:[UIImage imageNamed:@""] forState:UIControlStateHighlighted];
35 [backButton setTitle:@"返回" forState:UIControlStateNormal];
36  [backButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
37  [backButton setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
38 [backButton sizeToFit];// 图片自动适应按钮大小
39 //hy:然后这里设置按钮的内边距的偏移量 (上,左,下,右) 需要按照需求去改改 40 backButton.contentEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0);
41  [backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
42  backButton;
43  });
44 45 // 将上面这个自定义的按钮设置到导航控制器的返回按钮上 46 viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
47 // 隐藏底部的工具条 48 viewController.hidesBottomBarWhenPushed = YES;
49  }
50 // 上面设置搞定后,再push控制器显示出来 51  [super pushViewController:viewController animated:YES];
52 }
53 54 #pragma mark - <UIGestureRecognizerDelegate>
55 /**
56  * 手势识别对象会调用这个代理方法来决定手势是否有效
57  *
58  * @return YES : 手势有效, NO : 手势无效
59 */ 60 -(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
61 // 当前,导航控制器的子控制器有2个以上的时候,手势有效。 62 return self.childViewControllers.count > 1;
63 }
64 65 #pragma mark - 按钮监听的方法
66 // 导航控制器返回按钮监听的方法 67 -(void)back{
68  [self popViewControllerAnimated:YES];
69 }
70 71 @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方法会被执行。

时间: 2024-12-30 22:12:54

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

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

前言:因为常用,所以我就备份到这里,然后如果需要修改,可以根据需求进行相关的更改. 1 @implementation YMTabBarController 2 3 - (void)viewDidLoad { 4 [super viewDidLoad]; 5 /**** 初始化一些设置 ****/ 6 [self setUp]; 7 8 /**** 添加子控制器 ****/ 9 [self addChildViewControllers]; 10 } 11 - (void)setUp{ 12 1

学习iOS自定义导航控制器UINavigationController_IOS

自定义导航控制器: 将导航控制器中通用的部分拿出来统一设置 1.一般导航条标题的字体setTitleTextAttribute和背景颜色setBackgroundImage都是统一的,可以在load方法中使用appearanceWhenContainedIn统一设置 2.一般导航条的返回按钮需要自定义,一般除了栈底控制器有导航条,其他控制器都需要隐藏底部的条,可以重写pushViewController:animated:方法,在该方法中实现该功能 3.导航控制器右滑返回效果(触摸屏幕的任意一点

opengl-完成下面任意一个可视化功能模块设计,OpenGL或者mapgis(求代码)

问题描述 完成下面任意一个可视化功能模块设计,OpenGL或者mapgis(求代码) 1. 三维地质体建模功能(可基于钻孔数据.剖面数据或者混合数据展开设计) 2. 三维地形多层次细节(LOD)显示功能(可基于TIN地形或者GRID地形展开设计) 3. 地质体三维矢量剪切分析功能(可基于BSP树体剪切或者B-Rep模型面剪切展开设计)

iOS开发那些事-平铺导航–基于分屏导航及案例实现

平铺导航模式是非常重要的导航模式.一般用于简单的扁平化信息浏览或任务.扁平化信息是指这些信息之间没有从属的层次关系,如中国的城市中北京.上 海和哈尔滨之间是扁平化信息,而哈尔滨市与黑龙江省之间的关系是从属的层次关系,层次关系信息可以采用标签导航和树形结构导航. 从一个案例开始介绍平铺导航.如果我想为开发一个基于iPhone的"画廊"应用,目前只有3幅名画(左图是达芬奇-蒙娜丽莎.中图是罗丹-思想者.右图是毕加索-哭泣)收录到应用中.由于这3幅名画之间没有层次关系,他们之间是扁平的. 基

iOS开发入门:平铺导航-基于Page的导航及案例实现

基于分页导航实现 在iOS 5之后,可以使用分页控制器(UIPageViewController)构建类似于电子书效果的应用,我们称为基于分页的应用.一个分页应用有很多相关的视图控制器 开发入门:平铺导航-基于Page的导航及案例实现-"> 分页控制器(PageViewController)需要放置在一个父视图控制器中,在分页控制器下面还要有子视图控制器,每个子视图控制器对应图中的一个页面. 在基于分页导航实现的应用中需要的类和协议:UIPageViewControllerDataSour

iOS之小功能模块--彩虹动画进度条学习和自主封装改进

前言: 首先展示一下这个iOS小示例的彩色进度条动画效果: 阅读本文先说说好处:对于基础不好的读者,可以直接阅读文末尾的"如何使用彩虹动画进度条"章节,然后将我封装好的这个功能模块类用到你的工程项目中即可. 这个效果的示例是老外Nick Jensen在2013年写的一个作品:使用CAGradientLayer的动画进度条View. 本人阅读了老外的源码之后,觉得老外这个进度条的效果很不错,但是觉得他写的代码有待改进. 小贴士:读者可以直接将老外的源码下载下来,跑一下,然后对比本人写的博

简介iOS开发中应用SQLite的模糊查询和常用函数_IOS

SQLite模糊查询一.示例 说明:本文简单示例了SQLite的模糊查询 1.新建一个继承自NSObject的模型 该类中的代码: 复制代码 代码如下: // //  YYPerson.h //  03-模糊查询 // //  Created by apple on 14-7-27. //  Copyright (c) 2014年 wendingding. All rights reserved. // #import <Foundation/Foundation.h> @interface

iOS开发入门:平铺导航–基于分屏导航及案例实现

平铺导航模式是非常重要的导航模式.一般用于简单的扁平化信息浏览或任务.扁平化信息是指这些信息之间没有从属的层次关系,如中国的城市中北京.上  海和哈尔滨之间是扁平化信息,而哈尔滨市与黑龙江省之间的关系是从属的层次关系,层次关系信息可以采用标签导航和树形结构导航. 从一个案例开始介绍平铺导航.如果我想为开发一个基于iPhone的"画廊"应用,目前只有3幅名画(左图是毕加索-哭泣.中图是达芬奇-蒙娜丽莎.右图是罗丹-思想者)收录到应用中.由于这3幅名画之间没有层次关系,他们之间是扁平的.

iOS开发之聊天模块--内容保存逻辑实现

需求详解: 在实际开发中,有可能是在后期优化的时候,会有这么需要优化的需求:聊天输入框保存之前输入的文本,提高用户的良好体验. 在聊天模块中,用户可能会在输入框输入若干字符,但是没有点击发送就点击退出聊天,或者要点击用户头像确认用户的信息,或者比如需要向好友发送另一个好 友的ID不得不暂时退出当前好友聊天界面跳转找到别的界面找ID,然而当前聊天输入框也已经输入好了若干字符,用户当然不希望退出之后就删除之前输入好的 文字.所以这里就需要暂时保存用户输入好的但是没有发送出去的字符串. 但是,还需要满