目录:本文将分三个部分讲解block块的基本用法,由于本人水平有限,不足之处还望指正,谢谢!
一、block块的基本用法:
相信大家都很熟悉了,下面直接上代码:
//1,block初探,无参数,无返回值 void (^MyBlock)(void) = ^(void){ NSLog(@"2,打印出来了,我就是block,无参数,无返回值"); }; NSLog(@"1"); MyBlock(); //2,有参数,无返回值 void (^MyblockTwo)(int a) = ^(int a){ NSLog(@"@ = %d我就是block,有参数,无返回值",a); }; MyblockTwo(100); //3,有参数,有返回值 int (^MyBlockThree)(int, int) = ^int(int a,int b){ NSLog(@"%d我就是block,有参数,有返回值",a + b); return a + b; }; MyBlockThree(12,56);
以上三个是block最基本的用法,也是局部的block块,就不多说了,这主要争对初学者,主意block回调的时机。
二、block块的进阶用法:
我的代码是在实现文件中
声明:
- (void)getNameBlock:(void(^)(NSString *string))myBlockName;
实现:
- (void)getNameBlock:(void (^)(NSString *))myBlockName{
NSLog(@"我先走一步了哈");
[self laterGoBlock:myBlockName];
}
调用:
[self getNameBlock:^(NSString *string) {
NSLog(@"这次我小马哥真走了哈,%@",string);
}];
看这时候我又定义了一个block,这个block是全局的,在.h文件中定义如下:
声明:
- (void)laterGoBlock:(void(^)(NSString *))myBlockJC;
实现:
- (void)laterGoBlock:(void(^)(NSString *))myBlockJC{
myBlockJC(@"我是小马哥,知道我的目的了吧");//这个才是正宗的block回调,只有走这个方法才会真正的回调到上方的block块里也就是:(下图红色箭头指向的地方)
看我的目的是在这个方法中实现block的回调,如果这你理解了,那么不同界面用block传值就很简单了。
三、block传值:
首先定义两个类:
如左图所示:我要把MyfistView类中的值传给ViewController这个里;
1,MyfistView类中:
.h文件:
#import <UIKit/UIKit.h> typedef void(^myBlockPassString)(NSString *string);//定义一下block,看着舒服 @interface MyfistView : UIViewController @property (nonatomic, copy)myBlockPassString block;//把定义的Block作为属性 - (void)getPassValue:(myBlockPassString)blockMjc;//把block作为参数传递 @end
.m文件:
@implementation MyfistView{ UITextField *textFieldValue; } - (void)viewDidLoad{ self.view.backgroundColor = [UIColor blueColor]; //按钮 UIButton *buttonGo = [UIButton buttonWithType:UIButtonTypeCustom]; buttonGo.frame = CGRectMake(100.f, 100.f, 80.f, 40.f); buttonGo.backgroundColor = [UIColor lightGrayColor]; [buttonGo addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:buttonGo]; //textFieldValue textFieldValue = [[UITextField alloc] init]; textFieldValue.frame = CGRectMake(50.f, 200.f, 220.f, 30.f); textFieldValue.backgroundColor = [UIColor yellowColor]; [self.view addSubview:textFieldValue]; } - (void)buttonAction:(UIButton *)sender{ //第一个位置 /* if (self.block != nil) { self.block(textFieldValue.text); } */ [self dismissViewControllerAnimated:YES completion:^{ }]; } - (void)getPassValue:(myBlockPassString)blockMjc{ self.block = blockMjc; } - (void)viewWillDisappear:(BOOL)animated { //第二个位置 if (self.block != nil) { self.block(textFieldValue.text); } }
为了让大家看完整的过程我代码都贴出来了;回调的时机在第一个和第二个位置都可以,自己可以随意设置;
2,ViewController类中:
这个类基本没有什么可以写的,只需在.m中:
//创建一个按钮,一个label - (void)buttonAction:(UIButton *)sender{ MyfistView *myView = [[MyfistView alloc] init]; [self presentViewController:myView animated:YES completion:^{ }]; //这里就是block方法;string就是另一个类回调过来的值,把它赋给当前的label即可 [myView getPassValue:^(NSString *string) { labelGo.text = string; }]; }
这个类需要创建一个Button和Label,Button用来响应事件,Label用来显示传过来的值;OK,Block传值是不是很简单,估计对于初学者可能会犯迷糊,本文也是争对初学者。《本文完》