block的属性传值和 block的方法传值 代码示例

  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);


addViewController.m 中

解析:在这个页面也是添加一个手势和一个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)










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值