zoukankan      html  css  js  c++  java
  • 使用Block传值

             相对于delegate传值,Block传值相对简单方便,而delegate却需要写一大堆东西才能完成后一个界面向前一个界面的传值。但是Block也并非完全没有缺陷,它的使用成本相对delegate来说更高,Block需要将使用的数据从栈内存拷贝到堆内存,而delegate只保存了一个对象的指针,然后回调。delegate出厂日期相对久远,在各种语言中都相对成熟。但是很多情况下,Block都可代替delegate使用。

             使用Block传值的一个简单例子:将第二个视图中的textfeild的字符串传给第一个视图的label上。

    效果图:

    第二个视图

    @interface
    typedef void (^textBlock)(NSString *name);//创建block
    @property (nonatomic,copy)textBlock myblock;
    //@property (nonatomic,copy)void(^mybolck)(NSString *name);//也可在property中直接创建
    
    @implementation
    //在返回按钮的事件里
    myblock(_textF.text);//将textfeild的字符串传给block
    [self dismissViewControllerAnimated:YES completion:nil];

    第一个视图

    LastPage *page = [[LastPage alloc]init];//初始化第二个视图
        page.myblock = ^(NSString *name){
            _labelT.text = name;//设置第一个视图的lable值为block的参数
            _labelT.backgroundColor = [UIColor redColor];//在block的实现中设置label的背景颜色
        };

    另外也可以通过设置方法,将block设置为方法内的参数

    视图二

    typedef void(^colorBlock)(UIColor *green);
    @interface Humen : NSObject
    +(void)changeColor:(colorBlock)block;
    @end
    
    @implementation Humen
    +(void)changeColor:(colorBlock)block
    {
        UIColor *green = [UIColor greenColor];
        block(green);
    }
    @end

    视图一:在按钮实现中调用,按下后可变色(效果图如上)

    [Humen changeColor:^(UIColor *green) {
            [sender setBackgroundColor:green];
        }];

    另外:__block关键字的使用

    在Block的{}体内,是不可以对外面的变量进行更改的,如果更改会出现如下错误:Variable is not assigning (missing __block type)

     NSString *mytitle = @"moxue";
        void (^newBlock)(NSString *str) = ^(NSString *str){
            mytitle = str;
        };

    这是因为在初始化block以后,它会默认将和它一起初始化的变量认为是常量,如果要修改外部变量值,只需要在mytitle之前加上一个__block便不会报错

    __block NSString *mytitle = @"moxue";
        void (^newBlock)(NSString *str) = ^(NSString *str){
            mytitle = str;
        };
  • 相关阅读:
    mysql数据库8大优化方法
    libcurl与ftp构建小文件传输服务
    采用环形缓冲队列构建异步通信系统
    趣解堆排序--老子儿子争王位
    物联网网关设计实战
    一道来自腾讯基础架构部的笔试题
    深入理解Web Server原理----在CC3200 WiFi模块上构建轻量级Web Server
    C++数组实现的循环队列
    数据结构——栈
    (转)如何将本地git仓库上传到GitHub中托管+实践心得
  • 原文地址:https://www.cnblogs.com/moxuexiaotong/p/4966969.html
Copyright © 2011-2022 走看看