目錄:本文將分三個部分講解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傳值是不是很簡單,估計對於初學者可能會犯迷糊,本文也是爭對初學者。《本文完》