block 作为iOS开发的一个很重要的课程,相信大家都很希望能弄明白,今天用了下block的传值,希望下面的代码能帮到大家
一、block 作为属性的传值
ViewController.m 中
解析: 1、 在ViewController.m这个 界面 添加一个手势,可以触发方法跳到下一个页面 ,记得添加头文件 #import "addViewController.h"
2、在这个页面写一个lable ,label。text = @“11111111”
<span style="font-size:14px;color:#333333;">- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor grayColor];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(next)];
[self.view addGestureRecognizer:tap];
lable= [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
lable.text = @"111111111111";
[self.view addSubview:lable];
}
- (void)next
{
addViewController *add = [[addViewController alloc]init];
add.block = ^(NSString *name){
NSLog(@"%@",name);
[self updateName:name];
};
[self presentViewController:add animated:YES completion:nil];
}
- (void)updateName:(NSString *)name
{
lable.text = name;
}</span><span style="color:#ff0000;">
</span>
addViewController.h 中
定义一个block 的属性
@property (nonatomic,copy)void(^block)(NSString *name);
解析:在这个页面也是添加一个手势和一个lable,在点击手势回到第一个页面的时候,我们把这个lable上的值传到第一个页面
<span style="font-size:14px;color:#333333;">- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor greenColor];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(back)];
[self.view addGestureRecognizer:tap];
lable1 = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
lable1.text = @"2222222222222";
[self.view addSubview:lable1];
}
- (void)back
{
self.block(</span><span style="color: rgb(51, 51, 51); font-family: Arial, Helvetica, sans-serif;"><span style="font-size:12px;">lable1</span></span><span style="color: rgb(51, 51, 51); font-family: Arial, Helvetica, sans-serif;">.text);</span>
<span style="font-size:14px;color:#333333;">
[self dismissViewControllerAnimated:YES completion:nil];
}
</span>
二、block 作为方法传值
其实block作为方法的传值和作为属性的传值大致代码都是相同的,接下来我们看看代码是怎么实现block作为方法来传值的
ViewController.m 中
添加手势和label的方法就不写了,和上面的一样,刷新数据的方法也是一样的,我们来看看触发的方法
<span style="color:#666666;">- (void)next
{
addViewController *add = [[addViewController alloc]init];
[add getName:^(NSString *name) {
NSLog(@"%@",name);
[self updateName:name];
}];
[self presentViewController:add animated:YES completion:nil];
}</span><span style="color:#33cc00;">
</span>
不过要想调用这个方法,首先得有这个方法,所以,我们其实应该先在addViewController.h 中 定义一个block 的方法
<span style="font-size:14px;color:#333333;">- (void)getName:(void(^)(NSString *name))block;</span>
在 addViewController.m 中 ,添加手势和label 的方法和上面也是你一样的,我们也就不在这里多余的描述了
在手势触发回到上一个页面的时候,我们只要返回上一个页面就可以,因为我们是使用方法来传值,所以只需要在方法里面声明就可以了
- (void)back
{
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)getName:(void (^)(NSString *))block
{
lable1 = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
lable1.text = @"2222222222222";
block(lable1.text);
}
易错分析:
在我实现block 这个方法的时候,一开始仅仅是给block 赋值,但是没有实现效果,一开始我是这样做的,如下:
- (void)getName:(void (^)(NSString *))block
{
block(lable1.text);
}
因为我得label1 是设置的全局变量,所以我直接这样使用了,但是却
没有实现
反向传值这个问题,后来改成了这种方法,也就是上面的这个方法
- (void)getName:(void (^)(NSString *))block
{
lable1 = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
lable1.text = @"2222222222222";
block(lable1.text);
}
因为block 的传值是一个独立的过程,它需要有自己的对象,虽然我们使用的label1 是全局变量,但是block 却不知道它是怎么来的,所以我们要找到我们的label(大家也可以试试利用tag 值 来找到这个label)