• Block入门


           iOS4.0开始,Block横空出世,它其实就是c预言的补充,书面点说就是带有自动变量的匿名函数,Block简洁,代码的可读性也高,因此深受广大开发者的喜爱,这一次给大家介绍Block的基本类型和项目中的实际操作。

    Block的形式如下:

    Block的基本类型

    1.无参数无返回值

    void(^tempBlock)() = ^(){
            NSLog(@"无参无返回值");
        };
    //调用
    tempBlock();

    2.无参数有返回值

    int(^tempBlock)() = ^(){
            return 10;
        };
    //调用的时候,无论你输入的是什么都返回的是10;
    tempBlock(100);

    3.有参数无返回值

    void(^tempBlock)(int) = ^(int temp){
            NSLog(@"有参数无返回值");
     };

    4.有参数有返回值

    int(^tempBlock)(int) = ^(int number){
            return number;
        };
    //输入多少打印就是多少
    tempBlock(100);

    Block的经典实用场景

    1.修改外部变量

    __block int x = 100;
    void(^sumXWithYBlock)(int) = ^(int y){
          x = x + y;
          NSLog(@"new value %d",x);
     };
    //打印的值就是x+y,100+100=200
    sumXWithYBlock(100);

    2.页面间的传值

    //1.在第二个页面(SecondViewController)首先声明一个属性
    
    /**
    先声明block的名字,并确定参数的类型
    */
    @property(nonatomic,copy)void (^netViewBlock)(NSString *text);
    
    //2.在点击按钮返回的时候,往回传你需要传的参数,参数类型要一致
    
    -(void)back{
      self.netViewBlock(@"你好");
      [self.navigationController popViewControllerAnimated:YES];
    }

    3.在第一页(FirstViewController),准备push进入下一页的时候,获取ViewController2的属性,并实现。

    -(void)click:(UIButton *)sender{
    //把第二页的返回的值显示在label上
      UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(30, 100, 200, 30)];
      [self.view addSubview:label];
      SecViewController *vc = [[SecViewController alloc] init];
      vc.netViewBlock = ^(NSString *text){
          label.text = text;
      };
      [self.navigationController pushViewController:vc animated:YES];
    }

    自定义Block

    例子:点击Button,需要改变Button的title

    实现:

    1.创建一个工具类,声明一个类方法,并自定义一个block,需要传title,所以传参类型是NSString

    @interface ChangeBuTitleTool : NSObject
    +(void)changeBuTitleWithText:(void(^)(NSString *titleText))text;
    @end

    2.实现

    @implementation ChangeBuTitleTool
    +(void)changeBuTitleWithText:(void(^)(NSString *titleText))text{
      if (text) {
          text(@"tyler");
      }
    }
    @end

    3.在控制器里Button的点击的时候,实现改变title的方法

    -(void)addButton{
      UIButton *bu = [UIButton buttonWithType:(UIButtonTypeCustom)];
      bu.backgroundColor = [UIColor blueColor];
      bu.frame = CGRectMake(30, 90, 100, 50);
      [self.view addSubview:bu];
      [bu addTarget:self action:@selector(click:) forControlEvents:(UIControlEventTouchUpInside)];    
    }
    
    -(void)click:(UIButton *)sender{
      [ChangeBuTitleTool changeBuTitleWithText:^(NSString *titleText) {
          [sender setTitle:titleText forState:(UIControlStateNormal)];
      }]; 
    }

    4.Block与typedef的结合

       在上一个例子中,声明一个类方法,其中定义block直接写在类方法里,看起来很不和谐,尤其是对新手看起来可读性不太高,可以用typedef单独定义一个block,增加代码的可读性。

    typedef void (^titleBlock)(NSString *titleText);
    @interface ChangeBuTitleTool : NSObject
    +(void)changeBuTitleWithText:(titleBlock)text;
    //+(void)changeBuTitleWithText:(void(^)(NSString *titleText))text;
    @end
    
    @implementation ChangeBuTitleTool
    +(void)changeBuTitleWithText:(titleBlock)text{
      if (text) {
          text(@"tyler");
      }
    }
    @end

    Block入门篇就介绍到这里,下期更精彩!<( ̄︶ ̄)>

  • 相关阅读:
    #include<unistd.h>存在linux中,含有系统服务的函数
    Value Categories
    Main function
    Phases of translation
    Memory model
    Unqualified name lookup
    Qualified name lookup
    Name lookup
    Definitions
    Object lifetime
  • 原文地址:https://www.cnblogs.com/tylerzhang/p/5947263.html
Copyright © 2020-2023  润新知