博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
代理和block的混用
阅读量:4297 次
发布时间:2019-05-27

本文共 5616 字,大约阅读时间需要 18 分钟。

前言

代理和block是iOS开发中最常用的传值方式,具体的基本用法网上非常多,我就不一一讲解了,结合项目中最近遇到的一个小问题,做些个简单的笔记,供大家借鉴。最近忙于锻炼,疏于学习,要敲打下自己。言归正传,说问题。

项目中有一个做题模块,其中有答题卡的提交环节,答题卡是个完全独立的模块,我注重说下,答题卡提交的相关回调处理。这里只提供主要参考代码,其他细节请自行补充。

基本需求

点击答题卡的提交按钮,内部判断是否为需要全部做完才能提交, 是:检测是否全部做完,是:提交试卷。

可以通过代理或block 实现。

代理调用:

- (void)yg_submitFromAnswerSheetView{    if (_answerSheetItem.ygSubmitNeedAllAnswer && [_answerSheetView yg_isHasEmptyAnswer]) {        [Util showToastWithTitle:@"你还有题没有做完哦!" inView:[[UIApplication sharedApplication] keyWindow]];    } else {        [self dismissAnswerSheetVC];        if ([self.delegate respondsToSelector:@selector(yg_submitFromAnswerSheet)]) {            [self.delegate yg_submitFromAnswerSheet];        }    }}

代理实现:

- (void)yg_submitFromAnswerSheetVC{    [self yg_uniSubmitPaper:YES];}

升级需求

点击答题卡的提交按钮,外部调用优先判断时间是否大于30分钟,内部判断是否为需要全部做完才能提交,是检测是否全部做完,是则提交试卷。

可以通过代理加block 实现。

代理调用:

- (void)yg_submitFromAnswerSheetView{    if ([self.delegate respondsToSelector:@selector(yg_submitFromAnswerSheetMachining:)]) {        [self.delegate yg_submitFromAnswerSheetMachining:^BOOL(BOOL isCanSubmit) {            if (!isCanSubmit) {                return NO;            }            if (_answerSheetItem.ygSubmitNeedAllAnswer && [_answerSheetView yg_isHasEmptyAnswer]) {                [Util showToastWithTitle:@"你还有题没有做完哦!" inView:[[UIApplication sharedApplication] keyWindow]];                return NO;            } else {                [self dismissAnswerSheetVC];                return YES;            }        }];    } else {        if (_answerSheetItem.ygSubmitNeedAllAnswer && [_answerSheetView yg_isHasEmptyAnswer]) {            [Util showToastWithTitle:@"你还有题没有做完哦!" inView:[[UIApplication sharedApplication] keyWindow]];        } else {            [self dismissAnswerSheetVC];        }    }} 代理实现: - (void)yg_submitFromAnswerSheetVCMachining:(BOOL (^)(BOOL isCanSubmit))machining{    //校验服务器时间    [self.ygStore yg_checkSeverTimeForMockWithCompletion:^(BOOL isSuccess, NSTimeInterval passedTime)     {         if (isSuccess) {             //判断时间是否大于30分钟             BOOL isCanSubmit = [self yg_canSubmitPaperWithPassedTime:passedTime];             //判断是否已经全部作答             isCanSubmit = !machining ? isCanSubmit : machining(isCanSubmit);             if (isCanSubmit) {                 [self yg_submitPaper];             }         }     }];} 终极需求 点击答题卡的提交按钮,外部调用优先判断时间是否大于30分钟,内部判断是否为需要全部做完才能提交,是检测是否全部做完,是则提交试卷,未全部作答,提示弹窗(再看看,提交),点击弹窗提交,提交答题卡。 可以通过代理加block实现。 - (void)showAlertControllerNotice{    UIAlertController *alertController = [Util presentAlertControllerWithTitle:@"提示"                                                                       message:@"你还有题没做,确认要交卷吗?"                                                                  actionTitles:@[@"再看看", @"交卷"]                                                                  actionStyles:@[@1]                                                                preferredStyle:UIAlertControllerStyleAlert                                                                  clickHandler:^(NSUInteger buttonIndex, NSString *buttonTitle)                                          {                                              if (buttonIndex == 1) {                                                  [self submitFromAnswerSheetVC];                                              }                                          }];    [self presentViewController:alertController animated:YES completion:nil];}- (void)submitFromAnswerSheetVC{    [self dismissAnswerSheetVC];    if ([self.delegate respondsToSelector:@selector(yg_submitFromAnswerSheetVC)]) {        [self.delegate yg_submitFromAnswerSheetVC];    }}#pragma mark- Delegate Methods#pragma mark 
- (void)yg_submitFromAnswerSheetView{ //是否必须全部作答才能提交 if (_answerSheetItem.ygSubmitNeedAllAnswer) { //有未作答的题目 if ([_answerSheetView yg_isHasEmptyAnswer]) { [Util showToastWithTitle:@"你还有题没有做完哦!" inView:[[UIApplication sharedApplication] keyWindow]]; } else { //外部是否需要校验处理 if ([self.delegate respondsToSelector:@selector(yg_checkIsCanSubmitAnswerSheet:)]) { [self.delegate yg_checkIsCanSubmitAnswerSheet:^(BOOL isCanSubmit) { if (isCanSubmit) { [self submitFromAnswerSheetVC]; } }]; } else { [self submitFromAnswerSheetVC]; } } } else { //外部是否需要校验处理 if ([self.delegate respondsToSelector:@selector(yg_checkIsCanSubmitAnswerSheet:)]) { [self.delegate yg_checkIsCanSubmitAnswerSheet:^(BOOL isCanSubmit) { if (isCanSubmit) { [self showAlertControllerNotice]; } }]; } else { [self showAlertControllerNotice]; } }} 代理实现: //可以不用实现、不实现则不作外部控制,默认YES - (void)yg_submitFromAnswerSheetVCMachining:(BOOL (^)(BOOL isCanSubmit))machining{ //校验服务器时间 [self.ygStore yg_checkSeverTimeForMockWithCompletion:^(BOOL isSuccess, NSTimeInterval passedTime) { if (isSuccess) { //判断时间是否大于30分钟 BOOL isCanSubmit = [self yg_canSubmitPaperWithPassedTime:passedTime]; //判断是否已经全部作答 isCanSubmit = !machining ? isCanSubmit : machining(isCanSubmit); if (isCanSubmit) { [self yg_submitPaper]; } } }];} - (void)yg_submitFromAnswerSheetVC{ [self yg_uniSubmitPaper:YES];} 升级需求中,通过一个代理和一个block的传值和返回值控制答题卡能否提交的检测。终极需求中需要两个代理和一个block才能完成,加入了基于block的alert弹窗,我暂时没有特别好的办法,能将alert弹窗的block的处理结果用一个函数返回值进行接收。将代理拆分成检测和提交两个。 有知道的朋友欢迎交流补充。不足之处欢迎指正。谢谢。

转载地址:http://uudws.baihongyu.com/

你可能感兴趣的文章
时间格式化hh:mm:ss和HH:mm:ss区别
查看>>
When to use Delegation, Notification, or Observation in iOS
查看>>
Objective-C Autorelease Pool 的实现原理
查看>>
编程语言大牛王垠:编程的智慧,带你少走弯路
查看>>
ios指令集以及基于指令集的app包压缩策略
查看>>
iOS开发者的福利 — — iOS9+Xcode7免越狱免证书直接调试
查看>>
3、JavaWeb学习之基础篇—JSP
查看>>
4、JavaWeb学习之基础篇—Session
查看>>
5、JavaWeb学习之基础篇—标签(自定义&JSTL)
查看>>
8、JavaWEB学习之基础篇—文件上传&下载
查看>>
reRender属性的使用
查看>>
href="javascript:void(0)"
查看>>
h:panelGrid、h:panelGroup标签学习
查看>>
f:facet标签 的用法
查看>>
<h:panelgroup>相当于span元素
查看>>
java中append()的方法
查看>>
必学高级SQL语句
查看>>
经典SQL语句大全
查看>>
Eclipse快捷键 10个最有用的快捷键
查看>>
log日志记录是什么
查看>>