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入门篇就介绍到这里,下期更精彩!<( ̄︶ ̄)>

posted @ 2016-10-21 17:00  linfenren  阅读(156)  评论(0编辑  收藏  举报