一、基本语法
定义块的格式如下:
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);//把输入的内容传入块中
}
这里的判断就是判断该块是否被定义,如果定义,则调用这个块,并且把值回调过去。
本人愚钝,搞了半天才理解,希望大神指教