前言,在上篇文章Block相关(一),中介绍了Block相关的基础知识,包括Block介绍、基础语法、使用情况等。这篇我们将介绍Blcok的实战使用环境,毕竟语言是抽象的,代码应用才是具体的。
页面值传递
我们知道在父子控制器传递值的时候,为了解耦和合理的进行值传递,我们一般会用代理或者Block。Block的灵活性在值传递的时候能很好的体现。这里我们用一个简单的通讯录添加联系人功能作为演示,效果如下:
反向传值.gif
功能主要实现了,在添加联系人页面添加一个联系人,然后保存,并在通讯录首页展示,实现代码如下:
在新建联系人页面声明一个block成员变量:(Person为联系人模型)
/* 保存联系人的block */
@property (nonatomic, strong) void (^saveBlock)(Person *);
在通讯录首页跳转到新建联系人页面时给block赋值:
NewViewController *newVC = segue.destinationViewController;// 新建联系人控制器
__weak typeof(self) weakSelf = self;
/* 给block赋值 */
newVC.saveBlock = ^(Person *person) {
[weakSelf.personArr addObject:person];
[weakSelf.tableView reloadData];
};
在保存联系人时执行block:
// 点击保存按钮执行操作
- (IBAction)save:(UIButton *)sender {
Person *person = [[Person alloc] init];
person.name = self.personNamelabel.text;
person.phoneNumber = self.personNumberlabel.text;
!self.saveBlock ? : self.saveBlock(person);// 执行block
// 返回通讯录首页
[self.navigationController popViewControllerAnimated:YES];
}
这样一来就实现了,子页面向父页面逆向传值。原理有点像代理。父页面将拿到数据后要执行的操作封装到block中,由于ARC环境下,Block会复制到堆上,block对通讯录页面有强引用关系,所以新建页面执行block时候,block里面代码就可以拿到通讯录页面更新数据。
网友评论