block的高级用法(一) -- block传值

我们先从简单的入手,先讲下block的传值,后面会有更精彩的。

在讲传值之前我们先复习下block的基础知识:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    void(^block)() = ^() {
        NSLog(@"我被调用了");
    };
}
此时我定义了一个无返回值,无参数的block,当我运行的时候,没有任何输出。

当我加上一句代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    void(^block)() = ^() {
        NSLog(@"我被调用了");
    };
    
    block();
}
运行后,有了输出,输出如下:

前后对照着看很明显是block()这句才取到调用函数的目的。这让我们想起来了C语言中,我们通常在main函数外面来定义一个函数,然后在main函数内部调用:

#include 

void test() {
    printf("我被调用了");
}

int main(int argc, const char * argv[]) {
    
    test();
    return 0;
}
main函数中调用了声明的test函数。

我们发现block跟C语言的方式非常类似。不同点就是声明的方式不同:block可以在函数内部直接声明,紧接在block的后面,block就像函数的指针。不像C语言一样得单独的写成一块来声明函数


好了,我们现在说下今天的重点:

首先,我定义了两个控制器FirstViewController和SecondViewController。

FirstViewController中有一个Label和一个按钮,点击按钮会跳转到SecondViewController中,如图所示:

block的高级用法(一) -- block传值_第1张图片

SecondViewController中有一个textField的输入框,效果如图所示:

block的高级用法(一) -- block传值_第2张图片

实现的效果是当我在SecondViewController中的textField中输入字符,返回FirstViewController后会在里面的label中显示出来。

具体实现思路如下:

1.在SecondViewController.h中定义一个block:

#import 

/** 定义一个block */
typedef void(^blockName)(NSString *text);

@interface SecondViewController : UIViewController


//block在ARC中使用strong,非ARC中使用copy
@property (nonatomic, strong) blockName block;

@end

2.然后在返回FirstViewController的时候(为了方面此时我直接在- (void)viewWillDisappear:(BOOL)animated调用),实现block:

- (void)viewWillDisappear:(BOOL)animated {
    
    [super viewWillDisappear:animated];
    
    //判断block是否为空
    if (_block) {
        _block(self.textField.text);
    }
}
3.在FirstViewController中定义block的具体实现:

- (void)buttonClick {
    
    SecondViewController *second = [[SecondViewController alloc] init];
    second.block = ^(NSString *text) {
        self.label.text = text;
    };
    
    [self.navigationController pushViewController:second animated:YES];
}
实现的效果:
block的高级用法(一) -- block传值_第3张图片

返回后的效果:

block的高级用法(一) -- block传值_第4张图片

实现了上述效果。

对block不是很了解的同学可能会有些懵,所以我用通俗的话总结下block的基础知识:

1.在FirstViewController中我们只是写了block中的具体实现,block中的代码并不会立即执行。

2.在SecondViewController中我们通过block()来调用实现block内部代码的运行。

考虑到大家纯碎的看,估计不太好理解,我每次都会把源码拿出来,源码都在我的GitHub中,想要源码的点击这里。


你可能感兴趣的:(iOS,Object-C)