今天在 http://www.reviewcode.cn/reviewer.html?id=CcPkVLo96sIPCVG2 收到一份订单,本来以为只是进行Code Review,没有想到是帮忙解BUG。针对这个问题,我写了一个demo,并写下本篇文章,提供解决的思路。
在tableview的cell的多选题的情况下,有互斥的功能,根据RecordTwoLevelModel里面的参数strMutex_id,就是跟这个选项互斥的选项的id,这个bug就是选项之间现在不能互斥。
更详细地问题描述可以看这里: https://github.com/yidakouneihan/Sino/issues/1 。这是接收订单后对需求者所确认的问题描述。
@interfaceHYBTestModel: NSObject // 问题id @property (nonatomic, copy) NSString *qid; @property (nonatomic, copy) NSString *questionSummary; @property (nonatomic, copy) NSMutableArray *optionalAnswers; @end @interfaceHYBOptionalAnswerModel: NSObject // 选项答案id @property (nonatomic, copy) NSString *aid; // 选项答案内容描述 @property (nonatomic, copy) NSString *optionalAnswerSummary; // 辅助字段,标识是否选中 @property (nonatomic, assign) BOOL isSelected; // 互斥的选项,以英文逗号分割 @property (nonatomic, copy) NSString *strMutex_id; - (NSArray *)mutexIds; @end
这里是使用了两个模型,HYBTestModel是问题模型,HYBOptionalAnswerModel是可选答案的模型。它有一个互斥id字符中,用英文逗号分隔。
我们先看在做多选题时,最常见的就是四个选项中有一个选项是全不选,当选择全不选时,其它三个都要反选。当A、B或者C选中是,D一定要反选。如下效果图:
当选中某一个选项答案时,将所有与之互斥的反选。但是,当反选自己时,只是简单的反选,这样就可以解决互斥问题了。
- (void)tableView:(UITableView *)tableViewdidSelectRowAtIndexPath:(NSIndexPath *)indexPath { HYBTestModel *model = [self.datasourceobjectAtIndex:indexPath.section]; HYBOptionalAnswerModel *answerModel = [model.optionalAnswersobjectAtIndex:indexPath.row]; answerModel.isSelected = !answerModel.isSelected; if (answerModel.isSelected) { for (HYBOptionalAnswerModel *otherAnswerModel in model.optionalAnswers) { if (otherAnswerModel != answerModel && [answerModel.mutexIdscontainsObject:otherAnswerModel.aid]) { // 互斥 otherAnswerModel.isSelected = !answerModel.isSelected; } } } [tableViewreloadSections:[NSIndexSetindexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade]; }
我们再来看看A与B互斥、C与D互斥的例子。如果选A就不能选B,选B就不能先A;同样选C就不能选D,选D就不能先C。但是AB与CD互不干扰。
所处理的逻辑与上面的关键代码是一样的,因此这一段关键的代码的可以满足我们的需求了。
对于这种类型的问题,一定要采用模型法来处理。通过数据建模,可以非常方便地处理重用问题及多选问题。如果你还在通过记录indexPath、记录cell来处理这些问题,那不防试试笔者的方法吧。
大家可以下载源代码来参考参考: CoderJackHuang:MultiSelectMutexDemo
关注 | 账号 | 备注 |
---|---|---|
标哥博客iOS交流群一 | 324400294(满) | 群一若已满,请申请群二 |
标哥博客iOS交流群二 | 494669518 | 群二若已满,请申请群三 |
标哥博客iOS交流群三 | 461252383(满) | 群三若已满,请申请群四 |
标哥博客iOS交流群四 | 250351140 | 群四若已满,会有提示信息 |
关注微信公众号 | iOSDevShares | 关注微信公众号,会定期地推送好文章 |
关注新浪微博账号 | 标哥的技术博客 | 关注微博,每次发布文章都会分享到新浪微博 |
关注标哥的GitHub | CoderJackyHuang | 这里有很多的Demo和开源组件 |
关于我 | 进一步了解标哥 | 如果觉得文章对您很有帮助,可捐助我! |