iOS Block的簡單使用

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章