Block相关(二)

前言,在上篇文章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里面代码就可以拿到通讯录页面更新数据。

你可能感兴趣的:(Block相关(二))