使用Block传值

         相对于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;
    };
原文地址:https://www.cnblogs.com/moxuexiaotong/p/4966969.html