ios Block解决循环引用和回传值
存在这么一个需求:为了降低控制器的耦合度,自定义了视图控件,但是现在另外一个页面需要显示自定义视图上的值;需要用block回调到控制器中来显示
啰嗦了一大堆,说个简单明了的(需求:B控制器要向A控制器传值)。
1.首先第一步要在B控制器中定义block 例如:
#import "BViewController.h"
typedef void (^ AnswerBlock)(NSString *resutlStr);
@class GXRiskRelatedQuery;
@interface GXRiskViewController : BViewController
@property (nonatomic, copy) AnswerBlock answerBlock;
@end
2.来到B控制器的.m文件中,(回调的是网络数据,所以呢,应该在B控制器的网络请求成功的地方实现这个block)
#pragma mark 提交风险测评答案接口
- (void)requestDataWithRisksubmit:(NSString *)answerString
{
NSDictionary *params = @{@"fundid" : [[GXSharedClass sharedClass] GXAccount],
@"answers": answerString};
MJLog(@"params == %@",params);
[GXRisksubmit requestWithParams:params result:^(NSInteger respCode, NSString *respMsg, id responseObject) {
if (respCode == 1) {
GXRisksubmit *riskSubmit = (GXRisksubmit *)responseObject[0];
self.messageStr = riskSubmit.message;
[self setupAlertView];
// 这个是判断模型是否有数据的
if (riskSubmit.isHaveData) {
if (self.answerBlock) {
self.answerBlock(riskSubmit.risktype);// 这个是回调的值,也就是从模型中取得的值,也就是在A控制器中要显示的值
}
}
}
}];
}
3.然后来到A控制器中实现以下方法
首先需知道A控制器在那个地方push到B控制器中的(我写的项目我知道是在哪里push的)
B控制器 *BVC = [[B控制器 alloc] init];
__weak A控制器 *__self = self; // 此代码是解决循环引用的
riskViewVC.answerBlock = ^(NSString *answer){
[__self receiveAnwser:answer];
};
[self.navigationController pushViewController:BVC animated:YES];
4.最后还得实现一个方法(此方法是用来赋值的)
-(void)receiveAnwser:(NSString *)resultStr
{
_guardLabel.text = resultStr;
[GXSharedClass sharedClass].riskValue = resultStr;
}