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;

}

 

1
原文地址:https://www.cnblogs.com/fantasy3588/p/4627396.html