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

Block的形式如下:

Block的基本类型

1.无参数无返回值

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

2.无参数有返回值

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

3.有参数无返回值

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

4.有参数有返回值

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

Block的经典实用场景

1.修改外部变量

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

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

Block入门的更多相关文章

  1. iOS 学习 - 9.Block 入门

    来自李明杰的视频. block 用来保存一段代码 block 的标志:^ block  跟函数很像: 1).可以保存代码  2).有返回值  3). 有形参 temp1:没有返回值.没有形参的 blo ...

  2. (一)C++入门——指针与数组——Expression: _CrtIsValidHeapPointer(Block)

    最近在入门c++,在看<c++ Primer Plus>一书.书中P106提到,删除使用New创建的数组时,是将指针重新指到第一个元素后,再进行的删除操作.代码如下: int *ptest ...

  3. 【原创实现】C 多线程入门Demo CAS Block 2种模式实现

    分Cas和Block模式实现了demo, 供入门学习使用,代码全部是远程实现. 直接上代码: /* ================================================== ...

  4. POJ3734 Block母函数入门

    一段长度为n的序列,你有红黄蓝绿四种颜色的砖块,一块砖长度为1,问你铺砖的方案数,其中红黄颜色之和必须为偶数. #include <queue> #include <stack> ...

  5. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  6. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  7. C#线程入门---转载

    C#中的线程(一)入门 文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari,  翻译 Swanky Wu 中 ...

  8. io.js入门(二)—— 所支持的ES6(上)

    io.js的官网上有专门介绍其所支持的ES6特性的页面(点我查看),上面介绍到,相比nodeJS,io.js已从根本上支持了新版V8引擎上所支持的ES6特性,无需再添加任何运行时标志(如 --harm ...

  9. Hadoop学习笔记—2.不怕故障的海量存储:HDFS基础入门

    一.HDFS出现的背景 随着社会的进步,需要处理数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是却不方便管理和维护—>因此,迫切需要一种系统来管理多 ...

随机推荐

  1. HTML5_07之WebSocket

    1.HTML5新特性之WebSocket: ①HTTP协议的不足:基于“请求——响应”模型,只有在客户端发送请求后,服务器才会给予响应:对于实时的股票走势图,以及聊天通讯等无法满足需求: ②解决方案: ...

  2. tomcat安装和配置

    官网下载最新的tomcat9,解压 http://tomcat.apache.org/download-90.cgi 环境变量配置 JAVA_HOME: C:\Program Files\Java\j ...

  3. 解析大型.NET ERP系统 数据审计功能

    数据审计,英语表达是Audit,是追踪数据变化的过程,记录数据变化前后的值,供参考分析.通过设置,ERP可以追踪一个表的所有字段的变化,也可以只记录指定的字段的值变化.欧美企业每年都有独立的审计部门, ...

  4. SQLSERVER聚集索引与非聚集索引的再次研究(下)

    SQLSERVER聚集索引与非聚集索引的再次研究(下) 上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 ...

  5. IL指令详细表

    名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...

  6. web api添加拦截器

    实现思路 1.标识控制器有拦截特性: 2.控制器拦截处理: 代码实现 1.标识控制器有拦截特性,代码: [MyFilter] public string PostFindUser([FromBody] ...

  7. position:sticky的兼容性尝试

    开篇 笔者刚刚结束淘宝的工作,现在加入了一家有青春活力的垂直电商公司,正对着阿里巴巴的西溪园区,最近一直在熟悉新的工作环境和规范,因此博客有好些时间没有更新了,在此抱歉! 在忙碌完公司的发布系统之后, ...

  8. C#组件系列———又一款日志组件:Elmah的学习和分享

    前言:好久没动笔了,都有点生疏,12月都要接近尾声,可是这月连一篇的产出都没有,不能坏了“规矩”,今天还是来写一篇.最近个把月确实很忙,不过每天早上还是会抽空来园子里逛逛.一如既往,园子里每年这个时候 ...

  9. 【中文分词】条件随机场CRF

    之前介绍的MMEM存在着label bias问题,因此Lafferty et al. [1] 提出了CRF (Conditional Random Field). BTW:比较有意思的是,这篇文章的二 ...

  10. WinServer2008R2 + IIS 7.5 + .NET4.0 经典模式 运行WebAPI程序报404错误的解决方案

    在Windows Server 2008 R2系统下,IIS 7.5 + .NET Framework 4.0的运行环境,以经典模式(Classic Mode)部署一个用.NET 4.0编译的 Web ...