iOSBlock学习笔记

来源:互联网 发布:手机淘宝登录没反应了 编辑:程序博客网 时间:2024/06/05 22:41

一、基本语法
定义块的格式如下:

1.定义无参无返回值的块

void (^printStr)(void) = ^(void){    NSLog(@"这是定义无参无返回值的块");}

2定义带参有返回值的块

int (^add)(int,int) = ^(int a,int b){    return a + b;}

3.调用块

printStr();int c = add(3,4) // c = 7

block的基本语法大概就是这样,下面主要讲一讲blcok做为property属性在页面中传值回调的问题。大概就是第一个页面一个label,把第二个页面textfiled中输入的内容传入第一个页面在label上显示,直接上代码

首先在第二个页面.h中定义一个块属性

@property(nonatomic,copy) void (^nextViewControllerBlock) (NSString *text);

.m文件中

- (IBAction)backClicked:(id)sender {    //如果块被调用了,则执行    if (self.nextViewControllerBlock) {        self.nextViewControllerBlock(self.textFiled.text);//把输入的内容传入块中    }    [self.navigationController popViewControllerAnimated:YES];}

然后在第一个ViewController.m中

- (IBAction)nextClicked:(id)sender {    UIStoryboard *main = [UIStoryboard storyboardWithName:@"Main" bundle:nil];    NextViewController *nextVc = [main instantiateViewControllerWithIdentifier:@"2"];//这是直接在Storyboard中加载第二个界面,直接alloc init会导致黑屏,具体不多说,我不建议用Storyboard    //调用块    nextVc.nextViewControllerBlock = ^(NSString *text){        self.label.text = text;//把回调过来的值显示在label中    };    [self.navigationController pushViewController:nextVc animated:YES];}

之前我一直不懂的是,第一个页面点击了按钮过后,会先执行

nextVc.nextViewControllerBlock = ^(NSString *text){        self.label.text = text;//把回调过来的值显示在label中    };

这段代码,然后我就觉得很奇怪,如果现在就执行了,那是怎么把值传过来的呢?
后来我打断点跟踪,才发现它是先执行了这段代码,也就相当于给这个块赋值,定义了这个块,但这里也只是定义,并没有执行中括号中的内容,只有当调用这个块的时候,才会执行中括号中的内容,也就是当点击了第二个返回按钮,也就是这段代码

if (self.nextViewControllerBlock) {        self.nextViewControllerBlock(self.textFiled.text);//把输入的内容传入块中    }

这里的判断就是判断该块是否被定义,如果定义,则调用这个块,并且把值回调过去。
本人愚钝,搞了半天才理解,希望大神指教

1 0