Objective-C 中的 block 是一个相似于其余语言如 swift 中的闭包的东西。掌握好 block 的使用方法,可在项目开展中驾轻就熟,比较经常使用的是 block 的回调机制。下面就由具体的实例来作解析。web
关于 block 的相关语法,在本文不做详细描述,可是一些比较重要的概念和用法会穿插着解释一下。swift
首先看一个 block 回调的具体实例:闭包
控制器 A 中有两个控件,Label 和 Button ,Button 用于跳转至控制器 B , 控制器 B 中也有两个控件,分别是一个 Button 和一个 TextField。在控制器 B 中的文本框内输入文本,点击返回按钮后,会将输入的文本返回值控制器 A 中的 Label 上,以此便达到了回调传值的目的。一个很是简单的例子,具体的代码实现见下图:svg
控制器 B 代码:
ui
控制器 A 代码:
atom
分析:须要回调数据的是 A 视图,那么 Block 就应该在 B 中定义,用于获取传入回调数据。spa
控制器 B 中用 typedef 定义了 void(^) (NSString *text)的别名为 callBackBlcok 。这样咱们就能够在控制器 A 中,使用这个别名定义一个 Block 类型的变量 backBlock:code
#import <UIKit/UIKit.h>
typedef void(^callBackBlock)(NSString *text);
@interface BViewController : UIViewController
@property (nonatomic,strong) callBackBlock backBlock;
@end
在定义了 callBackBlock 以后,咱们能够在 B 中的点击事件中添加 callBackBlock 的传参操做:xml
- (void)backBtnClick
{
self.backBlock(self.textField.text);
[self dismissViewControllerAnimated:true completion:nil];
}
这样咱们就能够在想要获取数据回调的地方,也就 A 的视图中调用 block:blog
- (IBAction)ABtn:(UIButton *)sender {
__weak typeof(self) weakSelf = self;
BViewController *BVC = [[BViewController alloc] init];
BVC.backBlock = ^(NSString *text) {
weakSelf.ATextLabel.text = text;
};
[self presentViewController:BVC animated:true completion:nil];
}
经过回调将 B 中的数据传递到代码块中,并赋值给 A
中的 label,实现了整个回调过程。
须要注意的是,在上述代码中,为解决循环引用问题,一般使用弱引用。