本文共 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/