Block入门
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入门的更多相关文章
- iOS 学习 - 9.Block 入门
来自李明杰的视频. block 用来保存一段代码 block 的标志:^ block 跟函数很像: 1).可以保存代码 2).有返回值 3). 有形参 temp1:没有返回值.没有形参的 blo ...
- (一)C++入门——指针与数组——Expression: _CrtIsValidHeapPointer(Block)
最近在入门c++,在看<c++ Primer Plus>一书.书中P106提到,删除使用New创建的数组时,是将指针重新指到第一个元素后,再进行的删除操作.代码如下: int *ptest ...
- 【原创实现】C 多线程入门Demo CAS Block 2种模式实现
分Cas和Block模式实现了demo, 供入门学习使用,代码全部是远程实现. 直接上代码: /* ================================================== ...
- POJ3734 Block母函数入门
一段长度为n的序列,你有红黄蓝绿四种颜色的砖块,一块砖长度为1,问你铺砖的方案数,其中红黄颜色之和必须为偶数. #include <queue> #include <stack> ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- Hadoop入门学习笔记---part3
2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...
- C#线程入门---转载
C#中的线程(一)入门 文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari, 翻译 Swanky Wu 中 ...
- io.js入门(二)—— 所支持的ES6(上)
io.js的官网上有专门介绍其所支持的ES6特性的页面(点我查看),上面介绍到,相比nodeJS,io.js已从根本上支持了新版V8引擎上所支持的ES6特性,无需再添加任何运行时标志(如 --harm ...
- Hadoop学习笔记—2.不怕故障的海量存储:HDFS基础入门
一.HDFS出现的背景 随着社会的进步,需要处理数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是却不方便管理和维护—>因此,迫切需要一种系统来管理多 ...
随机推荐
- Enterprise Solution 管理软件开发框架流程实战
1 定义模块和功能 执行系统功能(SAUTSF),在系统主文件(System Master File SAMF)模块中增加功能SAMFEM,Employee Master. 给有权限的用户组分配功能S ...
- vue.js 开发生态总结
---title: Vue 1.0 的技术栈date: 2016-09-26 00:48:50tags:category:--- ## vuejs概述 Vue.js是用于构建交互式的Web界面的库.它 ...
- PhoneGap/cordvoa如何添加Media插件
phonegap由2.7升级到3.7之前,只要引入一个cordova.js,就可以了.现在由于所用的插件,都需要用模块的形式进行按需加载,自然就没有以前那么安逸了. 例如,如果要在安卓平台添加一个音频 ...
- 安卓第一次启动引导页使用ViewPager实现
我们在安装某个APP的时候,基本都会有一个引导页的提示,他们可以打广告,或者介绍新功能的加入和使用说明等.一般都支持滑动并且下面有几个点,显示共有多少页和当前图片的位置,在IOS上这个实现起来比较简单 ...
- Java正则速成秘籍(三)之见招拆招篇
导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...
- Angular 基础入门
简介 什么是AngularJS 一个功能非常完备的前端框架,通过增强HTML的方式提供一种便捷开发Web应用程序的方式 其核心特点就是几乎无任何DOM操作,让开发人员的精力和时间全部集中于业务 MVC ...
- 前端开发:setTimeout与setInterval 定时器与异步循环数组
前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的, ...
- C# webform上传图片并生成缩略图
其实里面写的很乱,包括修改文件名什么的都没有仔细去写,主要是想记录下缩略图生成的几种方式 ,大家明白就好! void UpImgs() { if (FileUpload1.HasFile) { str ...
- 【无私分享:ASP.NET CORE 项目实战(第十章)】发布项目到 Linux 上运行 Core 项目
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win7)上用虚拟机建了个 CentOS7 ,来演示下 ...
- C#实现微信开发前奏
不想废话,直接写了!因为是留给自己做随笔的,所以大神们看到别喷…… 1.必须有微信公众账号 2.你也可以申请测试微信号,链接给你 http://mp.weixin.qq.com/debug/cgi ...