在上篇博客 《iOS Block简介》 中,侧重解析了 iOS Block的概念等,本文将侧重于它们在开发中的应用。html
Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性。
用维基百科的话来讲,Block是Apple Inc.为C、C++以及Objective-C添加的特性,使得这些语言能够用类lambda表达式的语法来建立闭包。关于闭包,一句话解释简洁明了:闭包就是可以读取其它函数内部变量的函数。闭包
在iOS开发中,Block有不少方面的用途,界面反向传值就是其中之一。函数
假如咱们有一个需求以下:界面A上面有一个button、一个label。从界面A跳转到界面B,在界面B的输入框中输入字符串,在界面A的label上显示。这是一个典型的反向传值的例子。这个例子的核心是:“在界面B的输入框中输入字符串,在界面A的label上显示”。Block实现反向传值。post
一、在第二个视图控制器的.h文件中定义声明Block属性:atom
//定义block @property (nonatomic,copy) void (^NextViewControllerBlock)(NSString *tfText);
@interface NextViewController () @property (weak, nonatomic) IBOutlet UITextField *inputTF; @end - (IBAction)BtnAction:(id)sender { //判断block是否为空 if (self.NextViewControllerBlock) { self.NextViewControllerBlock(self.inputTF.text); } [self.navigationController popViewControllerAnimated:YES]; }
二、在第一个视图中得到第二个视图控制器,而且用第二个视图控制器来调用定义的属性:url
@interface AViewController () @property (weak, nonatomic) IBOutlet UILabel *nextVCInfoLabel; @end
- (IBAction)btnClicked:(id)sender { NextViewController *nextVC = [[NextViewController alloc]init]; nextVC.NextViewControllerBlock = ^(NSString *tfText){ self.nextVCInfoLabel.text = tfText; }; [self.navigationController pushViewController:nextVC animated:YES]; }
效果如图:spa
因为本文用的是XIB,省略了部分UI细节,附上本文的代码连接:源码。.net
哪里写的很差,望评论指点。谢过~code