[iOS类别的使用]---导航栏leftBarButtonItem图标修改
2016-03-30 15:31
369 查看
类别(Category) 修改特定的ViewController的导航栏Item图标
在项目中,遇到这样一个问题:
一个新增的VIewController1 想要push到原有的别的VIewController2中时
原有的VIewController2的导航栏左侧leftBarButtonItem图标,变成了系统自带的样式,
而且,由于项目混合使用了代码和StoryBoard开发,更增加了统一修改leftBarButtonItem的难度!
一般来说,我们会在 VIewController2 中 重新定义一个UIBarButtomItem ,插入如下代码进行局部修改
代码如下
如此代码修改好后:
而我所希望的是VIewController2 push到的下一个页面 也是如此
又或则VIewController1 push到 VIewController3页面, 箭头图标也要保持一直,难道我要写很多遍?
我又不想写一个UIViewController的子类 来作为这些类的父类用以继承,该怎么办??
这时候,
想起来类别(分类 Category)可以扩展类的方法和功能,
( 类别(Category)是一种可以为现有的类(包括类簇:NSString…,甚至源码无法获得的类)添加新方法的方式无需从现有的类继承子类。类别添加的新方法可以被子类继承。)
这个好,那么就为UIViewcontroller写一个分类吧
//然后,去控制器里面 ,添加头文件名,(或则去pch文件添加)
然后去时间分类.h里面的方法吧, 效果就出来了!!
**这也只是少了一半的代码量而已,如果我要全部修改成现有箭头的样式呢? StoryBoard 里面那么多控制器,我要一个个实现
这个方法吗??
这个问题我暂时还没想到,先把知道的写上吧.
然后,因为是正对UIViewController所写的分类,
所以我们只要去全局查找
[super viewDidLoad];
然后把它替换成:
目前看来,这是比较快捷的办法了
PS:个人感觉这样用分类+替换的方法, 要比单纯写一个父类然后去让众多子类继承要好操作一点,
在已经写好的VIewController上去修改他们的继承, 那个工作量还是比较大的~
——end
**
在项目中,遇到这样一个问题:
一个新增的VIewController1 想要push到原有的别的VIewController2中时
原有的VIewController2的导航栏左侧leftBarButtonItem图标,变成了系统自带的样式,
而且,由于项目混合使用了代码和StoryBoard开发,更增加了统一修改leftBarButtonItem的难度!
一般来说,我们会在 VIewController2 中 重新定义一个UIBarButtomItem ,插入如下代码进行局部修改
代码如下
-(void)changeleftItem{ UIImageView *imagview = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 32, 32)]; imagview.image = [UIImage imageNamed:@"jiantou"]; UIBarButtonItem *left = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"jiantou"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStyleDone target:self action:@selector(back)]; self.navigationItem.leftBarButtonItem = left; } -(void)back{ [self.navigationController popViewControllerAnimated:YES]; }
如此代码修改好后:
但是问题来了
如果 我只是修改一个部分, 那么代码量还是可以接受的,而我所希望的是VIewController2 push到的下一个页面 也是如此
又或则VIewController1 push到 VIewController3页面, 箭头图标也要保持一直,难道我要写很多遍?
我又不想写一个UIViewController的子类 来作为这些类的父类用以继承,该怎么办??
这时候,
想起来类别(分类 Category)可以扩展类的方法和功能,
( 类别(Category)是一种可以为现有的类(包括类簇:NSString…,甚至源码无法获得的类)添加新方法的方式无需从现有的类继承子类。类别添加的新方法可以被子类继承。)
这个好,那么就为UIViewcontroller写一个分类吧
//.h #import <UIKit/UIKit.h> @interface UIViewController (changeLeftItem) -(void)changeleftItem; @end //.m -(void)changeleftItem{ UIImageView *imagview = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 32, 32)]; imagview.image = [UIImage imageNamed:@"jiantou"]; UIBarButtonItem *left = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"jiantou"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStyleDone target:self action:@selector(back)]; self.navigationItem.leftBarButtonItem = left; } -(void)back{ [self.navigationController popViewControllerAnimated:YES]; }
//然后,去控制器里面 ,添加头文件名,(或则去pch文件添加)
然后去时间分类.h里面的方法吧, 效果就出来了!!
**这也只是少了一半的代码量而已,如果我要全部修改成现有箭头的样式呢? StoryBoard 里面那么多控制器,我要一个个实现
[super viewDidLoad]; [self changeleftItem];
这个方法吗??
这个问题我暂时还没想到,先把知道的写上吧.
好吧,我粗暴的解决了刚才的问题
1.把刚才的分类头文件 放到项目的pch文件中然后,因为是正对UIViewController所写的分类,
所以我们只要去全局查找
[super viewDidLoad];
然后把它替换成:
[super viewDidLoad]; [self changeleftItem];
我们看到, 总共替换了将近74处,如果要自己手动添加,估计要晕菜
**当然,这种简单粗暴的方法, 还需要注意,我们项目中,是有三个rootViewController的,而这三处,是不能添加箭头的,因此,我们只需要找到这三处, 删掉调用分类的方法即可,目前看来,这是比较快捷的办法了
PS:个人感觉这样用分类+替换的方法, 要比单纯写一个父类然后去让众多子类继承要好操作一点,
在已经写好的VIewController上去修改他们的继承, 那个工作量还是比较大的~
——end
**
相关文章推荐
- iOS quartzCore第四章——CAGradientLayer的使用
- 富文本 WPAttributedMarkup
- iOS软件开发--OC--ARC自动引用计数
- IOS实现一个简单的浏览器
- iOS--一些小技巧
- iOS--一些小技巧
- iOS磨砂(半透明)效果实现
- 解析iOS应用开发中对设计模式中的抽象工厂模式的实现
- iOS 检测新版本
- iOS 之国际化语言切换
- iOS中仅当视屏全屏播放时支持视屏旋转
- iOS开发——modifying the autolayout engine from a background thread
- 详解iOS应用开发中使用设计模式中的抽象工厂模式
- IOS蓝牙4.0使用心得
- 整理苹果官网上iOS的各种辅助功能
- RevealiOS使用教程之简易配置:不修改您的Xcode工程并加载Reveal
- iOS之9.3真机适配-Could not find Developer Disk Image问题
- 实例解析设计模式中的外观模式在iOS App开发中的运用
- 整理常用iOS的第三方框架
- Windows7上使用VMWare搭建IOS开发环境