在前面有一篇文章已经对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(nonatomic, copy)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之间的区别。