[iOS类别的使用]---导航栏leftBarButtonItem图标修改

news/2024/7/20 21:20:13 标签: ios, 导航, 类别, baritem, 分类

类别(Category) 修改特定的ViewController的导航栏Item图标

在项目中,遇到这样一个问题:
一个新增的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
**


http://www.niftyadmin.cn/n/1557863.html

相关文章

new 对象生成所有set方法

idea 快速生成new 出来对象的所有set方法&#xff0c;插件安装 - 程序员大本营

html不识别br/,后台返回br/,前端不换行解决办法

今天编写页面&#xff0c;后台直接返回带有html格式的字符串&#xff0c;包含<br/>&#xff0c;前端以为要展示<br/>&#xff0c;将其解析为<br/>页面不换行 解决办法 后台将<br/> 替换为 \n 并在前端添加样式style"white-space:pre-line&quo…

iOS报错 - If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variabl

Error: CGContextSetLineCap: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. 解决方法: 需要在plist文件中增加如下设置 将这个删除 或者 改为YES (没有这个,就是默认YES) 原因: iOS9系统的一…

android 控件各种颜色的半透明效果配置

格式&#xff1a; android:background"#XXxxxxxx"&#xff08;颜色可以写在color中&#xff09; 说明&#xff1a;半透明颜色值不同于平时使用的颜色&#xff0c;半透明颜色值共8位&#xff0c;前2位是透明度&#xff0c;后6位是颜色。 也就是说透明度和颜色结合就可…

Bigdecimal心得

BigDecimal cnt; BigDecimal totalCnt new BigDecimal(total); cnt new BigDecimal(po.getId() * 100); Double d cnt.divide(totalCnt, 2, BigDecimal.ROUND_HALF_UP).doubleValue(); 在这里100要先乘以整数&#xff0c;否则放到除完后再*100&#xff0c;则会出现没有保留…

MWebDown List 的使用测试

这里写代码片# MyMarkDown 标题1 标题1.1 重点内容 普通文字 斜体字 图片 代码 if (self) {self [[[NSBundle mainBundle] loadNibNamed:"ContractView" owner:self options:nil] objectAtIndex:0];self.backview.center self.center;self.backview.layer…

Docker安装运行Nginx

2019独角兽企业重金招聘Python工程师标准>>> 关于Docker运行Nginx的文章层出不穷&#xff0c;鄙人推荐http://www.runoob.com/docker/docker-install-nginx.html这篇文章中介绍的两种方法。在这里&#xff0c;我着重介绍下第二种方法吧&#xff0c;直接从docker Hub…

简陋的评分进度条动画

简陋的评分进度条动画 改变颜色 改变长度 使用drawRect方式构建所需UIview 代码 Line.h #import <UIKit/UIKit.h>interface Line : UIViewproperty (nonatomic,assign) NSNumber *with; //线宽 property (nonatomic,strong) UIColor *color; //颜色 property (non…