iOS - block的简单使用

本文详细介绍了如何利用Block在iOS应用中实现逆向数据传递,包括Block的定义、属性设置、传值方法以及具体示例。通过实践案例,展示了Block在简化逆向数据传递过程中的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



上班新来了一个同事 写了一个block传值的代码块,某天看见,终于想起来了被自己遗忘很久的传值问题。

正向传值,可用属性传递,较为简单,只要把值赋给下个页面的属性就可

逆向传值,有这样几种方法

1.代理协议 (传小数据的时候显得麻烦又拖沓)

2.通知传值 (有时候会占用内存,注册通知的页面销毁了,但通知并没有销毁)

3.block传值 (方便,但是初学者会被这个逻辑绕进去)

4.单例传值 (全局使用,一般单例用在用户信息)


现在简单说说block的传值 并且附上demo

假设现在有A页面 和 B页面 ,现在B页面逆向传值给A页面

那么,就在B页面定义一个block,A页面来使用即可!


1.在B.h文件中 



1⃣️设定一个block格式

注明: refreshTagsBlock 是block的名字,括号内是返回的参数,返回多个参数的话,只需要用逗号分隔

 typedef void (^refreshTagsBlock)(NSDictionary *);

2⃣️设定一个block属性

//设置block以及传入block

@property (nonatomic, copy) refreshTagsBlock block;

3⃣️设定一个方法,用来从A页面传一个block方法体过来赋值给属性block

- (void)transferTagsBlock:(refreshTagsBlock)block;



#import <UIKit/UIKit.h>

//定义一个block 第一个是全部Index 第二是Tag
typedef void (^refreshTagsBlock)(NSDictionary *);


@interface BVC : UIViewController

//设置block以及传入block
@property (nonatomic, copy) refreshTagsBlock block;
- (void)transferTagsBlock:(refreshTagsBlock)block;

@end





2.在B.m文件中

ck;

1⃣️ 实现方法- (void)transferTagsBlock:(refreshTagsBlock)block;

2⃣️block传值回去的地方

    if (self.block) {

        self.block(self.indexDic);

    }

注明: self.indexDic 是返回的参数


#pragma mark - 设置block
- (void)transferTagsBlock:(refreshTagsBlock)block{
    
    self.block = block;
}


//满足条件后block可以返回值
#pragma mark - 完成按钮
- (void)barButtonItemClick:(UIButton *)sender{
    

    [self.indexDic setObject:[NSString stringWithFormat:@"%ld",self.CurrentBtn.tag] forKey:@"snd"];
    
    NSIndexPath * indexPath = [NSIndexPath indexPathForRow:0 inSection:2];
    UITableViewCell * cell = [self.TagTableview cellForRowAtIndexPath:indexPath];
    
    NSMutableArray * indexArr = [[NSMutableArray alloc]init];
    for (int i = 0; i < self.goodsTagArr.count; i ++) {
        
        NSString * auto_id = self.goodsTagArr[i][@"auto_id"];
        
        UIButton * btn = (UIButton *)[cell.contentView viewWithTag:[auto_id integerValue] + 30000];
        
        if (btn.selected == YES) {
            [self.TagsArr addObject:btn.titleLabel.text];
            [indexArr addObject:[NSString stringWithFormat:@"%ld",btn.tag]];
        }
    }
    
    [self.indexDic setObject:indexArr forKey:@"third"];
    
    NSLog(@"所选Tag值 label %@",self.TagsArr);
    NSLog(@"%@",self.indexDic);
    
    [self.indexDic setObject:self.FirstBtn.titleLabel.text forKey:@"firstTitle"];
    [self.indexDic setObject:self.TagsArr forKey:@"tags"];
    [self.indexDic setObject:self.CurrentBtn.titleLabel.text forKey:@"sndTitle"];

    
    if (self.block) {
        self.block(self.indexDic);
    }
    
    
    [self.navigationController popViewControllerAnimated:YES];
    [self alertView:@"标签选择完毕"];
}






3.在点A文件里

1⃣️初始化B页面

2⃣️设置block方法体(此时不会马上执行这个代码块),只有当B页面返回block的时候才执行    

3⃣️跳转进入B页面
4⃣️等待B页面通过block返回所需值之后,开始执行A页面的blcok

BVC * bvc = [[BVC alloc]init];

        [bvc transferTagsBlock:^(NSDictionary * dic) {

            

            self.goodsIndex = dic;

            

            [self.tableview reloadData];

            

        }];

        

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值