在iOS 开发中经常会出现两个类互相通讯的情况,通知可以和代理都可以,但是通知用在这地方未免大才小用 代理写起来比较麻烦,所以block回调在这里就比较有用了,废话不多说,现在介绍iOS开发中的四种基本回调。
1.最简单的反向传值
场景 AController push -> BController
在B的.h文件中创建block
typedef void(^RetutnTextBlock)(NSString *showText);
定义block属性 和方法@property(nonatomic,copy)RetutnTextBlock returnTextBlock;
-(void)returnText:(RetutnTextBlock)block;
在B的.m文件中实现方法
-(void)returnText:(RetutnTextBlock)block{
self.returnTextBlock = block;
}
在想要传值的地方赋值
if (self.returnTextBlock != nil) {
self.returnTextBlock(@"这就是我要传的值");
}
在A控制器push的时候 调用block
[self.navigationController pushViewController:B animated:YES];
[B returnText:^(NSString *showText) {
_name = showText;
}];
2.定义一个方法作为属性的回调
在B的.h文件中创建block
@property(strong, nonatomic)void (^textBlock)(NSString *text);
在B的.m文件中赋值
if(_textBlock){
_textBlock(@"这就是要传的值");
}
在A控制器push的时候 调用block
[self.navigationController pushViewController:B animated:YES];
[B settextBlock:^( NSString *text) {
name=text;
}];
3.把block作为参数方法参数的回调
场景 AController push -> Controller
在B的.h文件中创建block和方法
typedef void(^textBlock)(NSString *text);
-(void)initWithFirstCategory:(NSString *)firstCategory AndtextBlock:(matchingBlock)block;
在B的.m文件中实现方法
@property(nonatomic,copy)textBlock block;
-(void)initWithFirstCategory:(NSString *)firstCategory AndMatchingBlock:(matchingBlock)block{
//把这个参数做一定的算法 然后返回
self.block=block;
self.block(@"这里是要返回的参数");
}
[B initWithFirstCategory:one AndMatchingBlock:^(NSString *text) {
name=text;
}];
typedef void(^textBlock)(NSString *text);
- (void)startWithSuccessBlock:(textBlock )successBlock
withFailedBlock:(textBlock )failedBlock;
-(void)startWithSuccessBlock:(textBlock)sucessBlock withFailedBlock:(textBlock)failedBlock{
for (int i=0; i<1000; i++) {
NSLog(@"%d",i);
}
if (arc4random() % 2==1) {
sucessBlock(@"成功的参数");
}else{
failedBlock(@"失败的参数");
}
}
在在A控制器 调用block
[B startWithSuccessBlock:^(NSString *text) {
//这里做成功的操作
} withFailedBlock:^(NSString *text) {
//这里做失败的操纵
}];
其实block不只是在两个控制器中用 在任何类里面都能 而且千变万化 我只是举了个例子
欢迎转载