相信大家都自定义过View,如果参数传的过多,那么初始化的方法就会变得很长
/** init方法 */
- (instancetype)initWithTitleArray:(NSArray*)titleArray
titleColorArray:(NSArray*)titleColorArray
btnColorArray:(NSArray*)btnColorArray;
如果只是自己使用的话,那还是可以接受的。但是如果将这个类作为公用类,将来别人用到的时候,有可能需要修改初始化方法,往里面添加参数,有些参数传值的时候还有约束,需要设置成nil,这样就很不利于维护,也不美观。
当然我们也可以这样初始化信息
/** 按钮上的文字数组 */
@property (nonatomic, strong) NSArray *titleArray;
/** 按钮上的文字颜色 */
@property (nonatomic, strong) NSArray *titleColorArray;
/** 按钮背景颜色 */
@property (nonatomic, strong) NSArray *btnColorArray;
能不能像masonry一样,通过链接的方式将参数赋值上去,下面就是我们想要实现的目标。
tv.titleArray(@[@"选择", @"加入打印列表", @"打印"]) .titleColorArray(@[[UIColor lightGrayColor]).btnColorArray([UIColor blueColor]);
探索
网上查了下资料,oc的方法是以中括号[]调用的,而()只有通过block的形式,所以我们有了大体的方向。
先写一个titleArray的block,注意这里的返回值要写他本身,否则后续调用其他参数的时候就会报错,毕竟void是没有方法的。
.h文件
- (TestView *(^)(NSArray *))titleArray;
.m文件
- (TestView *(^)(NSArray *))tvTitleArray { return ^(NSArray *titleArray) { self.titleArray = titleArray; return self; }; }
这里稍微解读下block
block的一般声明方式是:返回值类型(^block名称)(参数列表),
block实现是这样的,block变量=^(参数列表){函数实现};
![](https://img.haomeiwen.com/i1949507/b17b923a1b5cb757.png)
![](https://img.haomeiwen.com/i1949507/fa0e74fee7679be1.png)
当然我们这边可以通过typedef定义block,下面是使用过程。
typedef TestView *(^titleColorBlock)(NSArray *);
.h文件
- (titleColorBlock)tvTitleColorArray;
.m文件
- (titleColorBlock)tvTitleColorArray { return ^(NSArray *titleColorArray) { self.titleColorArray = titleColorArray; return self; } }
其他信息就不重复了,最后看下调用以及结果展示
tv.tvBtnColorArray(@[[UIColor yellowColor], [UIColor redColor]])
.tvTitleArray(@[@"选择", @"加入打印列表", @"打印"])
.tvTitleColorArray(@[[UIColor lightGrayColor], [UIColor greenColor], [UIColor blueColor]])
.tvUpdateUI();
![](https://img.haomeiwen.com/i1949507/5224a336438c3882.png)
OK,收工。
网友评论