block回调

2016-07-15  本文已影响77人  天空DE背面是阳光

每个刚接触OC的童鞋们,对block的使用都很头痛。

block是一个闭包,类似于函数,但是我们调用的时候传递的是一个代码块,它可以存在参数,这个参数并不是在定义block的时候就赋予值, 而是我们在实际运行block的时候才赋予值.(这一点需要注意,只有我们调用block时,才会运行代码块)

废话少说,下面我就讲下block作为形参和属性的时区别(直接上代码)

================================================

先建两个类,A类、B类;A跳转B类,通过block将B类的参数值回传A类

              --  A类  --                                                        -- B类 --

先在B类.h中声明一个代码块

typedef void(^changeLabel)(NSString * str)

1、block作为属性

(1)建立B类

在B.h中声明:

@property(nonatomic,copy)changeLabel blockOne;//作为属性

在B.m中:

- (void)viewWillDisappear:(BOOL)animated{

//    block调用(相当于函数的调用)

if (self.blockOne) {

self.blockOne(self.textField.text);//将B类中的文本框的内容传递给A类

}

}

(2)建立A类

在A.m中:

- (IBAction)next:(id)sender {

BClassVC  *b =[[BClassVC alloc]init];

//    block的定义类比于函数的定义(这个block只有在B类中被调用时才会执行,通过回调,将B类中的文本框的内容传递给A类)

b.blockOne= ^(NSString * str){

_label.text = str;

NSLog(@"======%@===blockOne=====",str);

};

[self.navigationController pushViewController:vc animated:YES];

}

2、block作为参数

(1)建立B类

在B.h中:

- (void)para:(changeLabel)blockTwo;//作为形参

在B.m中:

- (void)para:(changeLabel)blockTwo{

blockTwo(@"====para:(changeLabel)blockTwo===");

}

(2)建立A类

在A.m中

- (IBA)Click:(id)sender{

BClassVC  *b =[[BClassVC alloc]init];

/*调用para:(changeLabel)blockTwo

通过形参Block回调打印“====para:(changeLabel)blockTwo===”*/

[b para:^(NSString *str) {

NSLog(@"%@",str);

}];

}

欢迎常来,不足之处,各位小伙伴多提意见,一起交流,一起进步。

上一篇 下一篇

猜你喜欢

热点阅读