1.block作为参数
相信大家用block已经用了很久了,我今天主要记录下带返回类型,切返回类似为该类对象的block。感觉有点绕。先看看block的定义,我的理解是 block是事先定义好的一段代码段,在合适的时候被传入参数值且被调用。
typedef void(^ChOkBtnClickBlock)(NSString *Msg); 这样我们定义了一个名叫 ChOkBtnClickBlock的block。
该block的返回值为空,参数为字符串类型。
但是如果,返回值类型也为NSString是个什么鬼呢?我们平时应该很少用到吧?
就是这个样子:
typedef NSString *(^ChOkBtnClickBlock)(NSString *Msg);
在属性中增加
@property(nonatomic,copy)ChOkBtnClickBlock chOkBtnOption;
在OkBtn的点击事件中增加
#pragma mark ---确定按钮点击
/**确定按钮点击*/
- (IBAction)sureBtnClick:(UIButton *)sender {
if (self.chOkBtnOption) {
NSString *blockReturnStr=@"";
//执行完毕block返回当前block的返回值
blockReturnStr=self.chOkBtnOption(@"okBtnInfo");
NSLog(@"blockReturnStr:%@",blockReturnStr);
}
}
在特定的地方把block要执行的代码写好
chOkBtnOption=^NSString *(NSString *Msg)
{
NSString *newMsg=[NSString stringWithFormat:@"我是新的%@",Msg];
return newMsg;
};
执行结果如图
好了,上面大概就是block的一个回顾。
一个block作为参数的回顾
2 block作为返回值
先思考个问题,我们为什么要让block作为返回值呢,有什么好处?我们继续回忆一下block的特性,预先写好的一段程序代码,在特定的时候执行。
当我们写了一个类M的对象方法A的时候,我们需要执行该方法时就需要 alloc一个对象Obj 然后该对象调用A方法:[Obj A];
同时我们又写了 类M的对象方法 B ,C ,D 如果要执行他们呢?貌似我们只能一个一个方法挨着执行。如下
[Obj A];
[Obj B];
[Obj C];
[Obj D];
我们能不能一行代码就执行4个方法呢?
我们知道,要执行对象的方法,必须要是对象的实例,例如要执行类M的A方法必须要
[Obj A];此时必须要有一个实例对象Obj
那么我们可以通过block来返回一个实例对象 例如
/** 设置取消和确定的字体颜色 */
-(ChNormalPickView *(^)(UIColor *))chSetPickButtonColor;
说明一下:有一个名叫 chSetPickButtonColor 的对象方法。
返回值是一个 参数为UIColor的Block,也就是说,执行这个chSetPickButtonColor方法会得到一个Block(实值一段代码段),同时 Block的返回值类型为 ChNormalPickView (可以简单理解类似为 NSString 这样的类)。也就是说调用block 会得到一个返回值 ChNormalPickView的对象M。
例如 M.chSetPickButtonColor(myColor)的返回值还是M
即类似 M.chSetPickButtonColor(myColor)==M对象,然后可以继续用M对象调用其他对象方法 如 M.A().B().C().D()
粘贴一段代码端给大家参考下
1方法声明
/** 设置取消和确定的字体颜色 */
-(ChNormalPickView *(^)(UIColor *))chSetPickButtonColor;
2方法实现
/** 设置取消和确定的字体颜色 */
-(ChNormalPickView *(^)(UIColor *))chSetPickButtonColor
{
return ^ChNormalPickView *(UIColor *titleColor){
[self.cancelButton setTitleColor:titleColor forState:UIControlStateNormal];
[self.sureButton setTitleColor:titleColor forState:UIControlStateNormal];
return self;
};
}
3方法调用
pick.chSetPickButtonColor([UIColor redColor]);
回头我传一个demo到github
哈哈希望大家可以在GitHub上面start
demo的地址 https://github.com/juefeiyechen/IosBlockLianShi.git