相对于delegate传值,Block传值相对简单方便,而delegate却需要写一大堆东西才能完成后一个界面向前一个界面的传值。但是Block也并非完全没有缺陷,它的使用成本相对delegate来说更高,Block需要将使用的数据从栈内存拷贝到堆内存,而delegate只保存了一个对象的指针,然后回调。delegate出厂日期相对久远,在各种语言中都相对成熟。但是很多情况下,Block都可代替delegate使用。
使用Block传值的一个简单例子:将第二个视图中的textfeild的字符串传给第一个视图的label上。
效果图:
第二个视图
@interface typedef void (^textBlock)(NSString *name);//创建block @property (nonatomic,copy)textBlock myblock; //@property (nonatomic,copy)void(^mybolck)(NSString *name);//也可在property中直接创建 @implementation //在返回按钮的事件里 myblock(_textF.text);//将textfeild的字符串传给block [self dismissViewControllerAnimated:YES completion:nil];
第一个视图
LastPage *page = [[LastPage alloc]init];//初始化第二个视图 page.myblock = ^(NSString *name){ _labelT.text = name;//设置第一个视图的lable值为block的参数 _labelT.backgroundColor = [UIColor redColor];//在block的实现中设置label的背景颜色 };
另外也可以通过设置方法,将block设置为方法内的参数
视图二
typedef void(^colorBlock)(UIColor *green); @interface Humen : NSObject +(void)changeColor:(colorBlock)block; @end @implementation Humen +(void)changeColor:(colorBlock)block { UIColor *green = [UIColor greenColor]; block(green); } @end
视图一:在按钮实现中调用,按下后可变色(效果图如上)
[Humen changeColor:^(UIColor *green) {
[sender setBackgroundColor:green];
}];
另外:__block关键字的使用
在Block的{}体内,是不可以对外面的变量进行更改的,如果更改会出现如下错误:Variable is not assigning (missing __block type)
NSString *mytitle = @"moxue"; void (^newBlock)(NSString *str) = ^(NSString *str){ mytitle = str; };
这是因为在初始化block以后,它会默认将和它一起初始化的变量认为是常量,如果要修改外部变量值,只需要在mytitle之前加上一个__block便不会报错
__block NSString *mytitle = @"moxue"; void (^newBlock)(NSString *str) = ^(NSString *str){ mytitle = str; };