block的使用从简入深
我们先来写一个block讲解下基本结构
int(^BackgroundBlock)(id)
看这个block,他的名字叫做BackgroundBlock,前面的int就是你需要在这个block中给他返回一个int值,(id)这个是你传入的参数
那么我们就可以总结一下block的总体写法:
有返回值的:返回值的类型 +(^block的名字) +(传入的参数)
无返回值的:void +(^block的名字) +(传入的参数)
无返回值也无传参的:void +(^block的名字)
是不是很通俗?
我们以一个设置背景颜色举个例子大家就会很清楚了:
我们这里是通过nameViewController的方法回调改变ViewController的背景颜色
nameViewController.h
/*
*声明一个block类型可以使用它去创建无数个这样的对象
*/
typedefint(^BackGroundBlock)(id,id);
@interfacenameViewController :UIViewController
/*
*一般情况下block的属性声明使用的是copy,这里是声明一个
*/
@property(nonatomic,copy)BackGroundBlockbackgroundblcok;
/*
*这里写了一个接口去回调,timeStr这个参数并没有什么用,只是为了方便大家看的更清楚所以写了这么一个。
*/
-(void)getViewTimeString:(NSString* )timeStr andBackgroundColorBlock:(BackGroundBlock)groundBlock;
@end
nameViewController.m
#import"nameViewController.h"
@interfacenameViewController()
@end
@implementationnameViewController
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view.
/*
*实现声明的那个block赋值注意了这个东西是必须要去实现你才能掉不然也会蹦的哦
*/
inta =self.backgroundblcok([UIColorgreenColor],[UIColorredColor]);
NSLog(@"----------返回值为:%d",a);
}
/*
*实现接口的方法
*/
-(void)getViewTimeString:(NSString*)timeStr andBackgroundColorBlock:(BackGroundBlock)groundBlock{
if([timeStrisEqualToString:@"2"]) {
/*
*这里实现的是我们接口中的那个方法参数
*/
intb =groundBlock([UIColorpurpleColor],[UIColororangeColor]);
NSLog(@"--------方法返回值为:%d",b);
}else{
intc =groundBlock([UIColorwhiteColor],[UIColorlightGrayColor]);
NSLog(@"----------方法返回值为:%d",c);
}
}
ViewController.m
#import"ViewController.h"
#import"nameViewController.h"
@interfaceViewController()
@end
@implementationViewController
- (void)viewDidLoad {
[superviewDidLoad];
UIButton* btn = [[UIButtonalloc]init];
btn.frame=CGRectMake(100, 100, 100, 100);
btn.backgroundColor= [UIColorredColor];
[self.viewaddSubview:btn];
[btnaddTarget:selfaction:@selector(onClick:)forControlEvents:UIControlEventTouchUpInside];
}
-(void)onClick:(UIButton* )sender{
/*
*回调block的时候在里面使用的话我们必须要把那个属性给弱引用一下,因为block里面会强引用你的属性,会发生无限循环导致卡死或者得不到你想要的效果
*/
__weakViewController* wek =self;
nameViewController* nameVC = [[nameViewControlleralloc]init];
/*
*实现以属性来回调的block
*/
//nameVC.backgroundblcok =^int(UIColor * color,UIColor * nameColor){
//
//int a = [@"1234567890" intValue];
//
//wek.view.backgroundColor = color;
//
//return a;
//};
/*
*实现以接口来回调的block
*/
[nameVCgetViewTimeString:@"1"andBackgroundColorBlock:^int(UIColor* color,UIColor* nameColor) {
/*
*这里就可以写你需要实现的代码了是不是超级简单?int(UIColor * color, UIColor * nameColor)原本是int(id, id)这个地方要非常需要注意一下因为你在声明的时候没有给他具体的参数,所以你这里需要给具体的参数,不然会报错哟~ ~
*/
wek.view.backgroundColor= color;
return[@"213123123"intValue];
}];
[self.navigationControllerpushViewController:nameVCanimated:YES];
}
看完这些应该就会懂了希望能帮到大家这个复制来的如果看不懂下面给大家附上截图
nameViewController.h
nameViewController.h(此标题指上方的图片) nameViewController.m(此标题指的是上方的图片) ViewController.m(此标题指的是上方的图片)
如果有什么需要注意的或者有什么不对的地方希望大家给点意见哈,初次写这些东西表达不是太好见谅O(∩_∩)O哈!