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传值是不是很简单,估计对于初学者可能会犯迷糊,本文也是争对初学者。《本文完》

 

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