上班新来了一个同事 写了一个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;
}
#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的时候才执行
BVC * bvc = [[BVC alloc]init];
[bvc transferTagsBlock:^(NSDictionary * dic) {
self.goodsIndex = dic;
[self.tableview reloadData];
}];
[self.navigationController pushViewController:bvc animated:YES];