前言
IOS 开发中UIView 是我们经常需要使用的类,尤其是在创建指定tag 值的UIView 类控件添加到父视图上。通常情况下都需要这样写
UIView *backV = [self.view viewWithTag:100];
if(backV == nil){
backV = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width,20)];
backV.backgroundColor = [UIColor redColor];
backV.tag = 100;
[self.view addSubview:backV];
}
我们需要先通过该tag 值判断是否已经创建了该控件,没有创建时再创建添加到父视图上,但是这样的代码条件判断过多,看着不优雅。有什么优雅的方式是能实现该功能?
目标
通过oc 的反射机制和block 回调实现该功能,通过oc的分类功能为UIView 增加新的类方法
UIView+Tag.h 文件代码如下
#import <UIKit/UIKit.h>
typedef void(^InitViewBlock)(UIView *view);
@interface UIView (Tag)
/**
*根据反射动态创建相关视图----->减少视图被多次创建添加
*如:
*UIImageView.zllView(withTag: 1000, in: self.view) 则创建一个UIImageView 视图添加到self.view 上,
*并设置tag 值为1000
*
*UIView.zllView(withTag: 1000, in: self.view) 则创建一个UIView 视图添加到self.view 上,
*并设置tag 值为1000
*
*/
//tag 视图的tag值
//pView 父视图
//block 视图没有在父视图上,则被创建时执行的初始化操作,回调参数为创建的对象
+(UIView *)initWithTag:(int)tag inView:(UIView *)pView block:(InitViewBlock)block;
@end
UIView+Tag.m文件如下
#import "UIView+Tag.h"
@implementation UIView (Tag)
+(UIView *)initWithTag:(int)tag inView:(UIView *)pView block:(InitViewBlock)block {
UIView *view = [pView viewWithTag:tag];
if(view == nil){
view = [self.class new];
view.tag = tag;
[pView addSubview:view];
block(view);
}
return view;
}
@end
验证
此时我们的代码是不是更简洁,代码中也没有了 if 条件判断,在代码块回调中做初始化信息(代码块捕获self 也不会产生循环引用,如果自定义的子类需在init 构造方法中完成相关初始化操作),每次需要动态更新的信息写在下面(避免重复相同功能的代码影响效率,如字体大小都是固定的16,我们就放到代码块中初始化) ,是不是很简洁。
如果对您有帮助,点个赞支持 奶茶37.2℃ 创作更优秀的博文