block初始化UIView 类

前言

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℃ 创作更优秀的博文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值