美文网首页
Block相关(二)

Block相关(二)

作者: DDB_CS | 来源:发表于2018-03-01 11:47 被阅读10次

    前言,在上篇文章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相关(二)

          本文链接:https://www.haomeiwen.com/subject/yxrjvxtx.html