iOS Block传值

在前面有一篇文章已经对Block做了讲解:点击打开链接 这里是链接

前面也说了代理和通知,这两种设计模式的使用可以用来传值,这里再说Block,也是想说一下如何使用Block实现传值。

使用Block进行不同类之间的传值,常用场景也是在两个控制器之间实现反向传值,也就是有A、B两个控制器,由A跳转到B,在由B返回到A。在由B返回的时候,这里需要的传值就叫做反向传值,也叫逆向传值。下面,就在代码中实现如何使用Block去逆向传值。

代码示例:

AViewController.m文件代码:

#import "AViewController.h"

#import "BViewController.h"


@interface AViewController ()

{

    UIButton *button;

    UILabel *label;

}

@end


@implementation AViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    [self setUI];

}


#pragma 创建视图

- (void)setUI{

    label = [[UILabel alloc]initWithFrame:CGRectMake(100, 200, 200, 30)];

    label.text = @"传值将在这里展示";

    label.font = [UIFont systemFontOfSize:15];

    label.backgroundColor = [UIColor yellowColor];

    [self.view addSubview:label];

    

    button = [UIButton buttonWithType:UIButtonTypeCustom];

    button.frame = CGRectMake(100, 300, 200, 30);

    button.backgroundColor = [UIColor blueColor];

    [button setTintColor:[UIColor whiteColor]];

    [button setTitle:@"点击跳转" forState:UIControlStateNormal];

    [button addTarget:self action:@selector(push) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:button];

}


#pragma 按钮点击事件,页面跳转

- (void)push{

    //创建B控制器对象

    BViewController *bVC = [[BViewController alloc]init];

    //6、调用B控制器的block属性,获取到传值,并展示

    bVC.block = ^(NSString *string){

        label.text = string;

    };

    [self.navigationController pushViewController:bVC animated:YES];

}


@end

BViewController.h文件代码:

#import <UIKit/UIKit.h>


//1、声明Block

typedef void (^myBlock)(NSString *);


@interface BViewController : UIViewController


//2、声明属性,将Block作为控制器的成员属性

@property(nonatomic, copy)myBlock block;


//3、声明方法

- (void)sendValueToA:(myBlock )block;


@end

BViewController.m文件代码:

#import "BViewController.h"


@interface BViewController ()

{

    UIButton *button;

    UILabel *label;

}

@end


@implementation BViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor grayColor];

    

    label = [[UILabel alloc]initWithFrame:CGRectMake(100, 200, 200, 30)];

    label.text = @"B页面的传值";

    label.font = [UIFont systemFontOfSize:15];

    label.backgroundColor = [UIColor yellowColor];

    [self.view addSubview:label];

    

    button = [UIButton buttonWithType:UIButtonTypeCustom];

    button.frame = CGRectMake(100, 300, 200, 30);

    button.backgroundColor = [UIColor blueColor];

    [button setTintColor:[UIColor whiteColor]];

    [button setTitle:@"点击返回" forState:UIControlStateNormal];

    [button addTarget:self action:@selector(pop) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:button];

}



#pragma Block方法实现

//4、实现block方法

- (void)sendValueToA:(myBlock)block{

    self.block = block;

}


#pragma 按钮点击事件,页面返回,并传值

- (void)pop{

    //5、判断block对象是否存在,并给block传值

    if (self.block != nil) {

        self.block(label.text);

    }

    [self.navigationController popViewControllerAnimated:YES];

}


@end

运行结果:

程序刚运行:                                               跳转到B控制器:                                   返回到A控制器:

                   

在上面的图片中可以看出,传值没有问题,将B控制器中label上的字符串传递给了A控制器并且在label上进行了展示。

下面回到代码中,看看使用Block传值的步骤是如何:

第一步:声明Block,在前面的一篇文章中对Block做了介绍,知道,如何声明一个Block,这里是声明了一个没有返回值额Block,并且参数是一个字符串,这里的字符串就是与第五步中的调用block是给传递的参数对应。

//1、声明Block

typedef void (^myBlock)(NSString *);

第二步:将Block的对象作为控制器的成员属性进行声明。

//2、声明属性,将Block作为控制器的成员属性

@property(nonatomiccopy)myBlock block;

第三步、第四步:声明和实现方法,这个方法的作用是,对上面声明的属性进行赋值。

//3、声明方法

- (void)sendValueToA:(myBlock )block;

//4、实现block方法

- (void)sendValueToA:(myBlock)block{

    self.block = block;

}

第五步:判断是否存在block对象,并给block传递参数,这个参数就是要传递的值,这里是一个字符串,在实际的开发中可以传递任意类型的对象。

//5、判断block对象是否存在,并给block传值

    if (self.block != nil) {

        self.block(label.text);

    }

第六步:在要接收传值的控制器中创建控制器对象,调用block属性,接收传值。

//创建B控制器对象

    BViewController *bVC = [[BViewController alloc]init];

    //6、调用B控制器的block属性,获取到传值,并展示

    bVC.block = ^(NSString *string){

        label.text = string;

    };


使用Block传值的内容,到这里基本上就说完了。上面的六个步骤就是使用Block的公式,按照这个公式就可以很好的使用Block进行页面之间的传值。

在下面的一片文章,会详细讲解页面传值和通知,代理,Block之间的区别。

猜你喜欢

转载自blog.csdn.net/m0_37681833/article/details/68922147
今日推荐