转载

iOS多选Cell处理互斥问题

前言

今天在 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互斥

我们先看在做多选题时,最常见的就是四个选项中有一个选项是全不选,当选择全不选时,其它三个都要反选。当A、B或者C选中是,D一定要反选。如下效果图:

iOS多选Cell处理互斥问题

关键代码

当选中某一个选项答案时,将所有与之互斥的反选。但是,当反选自己时,只是简单的反选,这样就可以解决互斥问题了。

  - (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互斥、C与D互斥的例子。如果选A就不能选B,选B就不能先A;同样选C就不能选D,选D就不能先C。但是AB与CD互不干扰。

iOS多选Cell处理互斥问题

所处理的逻辑与上面的关键代码是一样的,因此这一段关键的代码的可以满足我们的需求了。

提示

对于这种类型的问题,一定要采用模型法来处理。通过数据建模,可以非常方便地处理重用问题及多选问题。如果你还在通过记录indexPath、记录cell来处理这些问题,那不防试试笔者的方法吧。

源代码

大家可以下载源代码来参考参考: CoderJackHuang:MultiSelectMutexDemo

关注我

关注 账号 备注
标哥博客iOS交流群一 324400294(满) 群一若已满,请申请群二
标哥博客iOS交流群二 494669518 群二若已满,请申请群三
标哥博客iOS交流群三 461252383(满) 群三若已满,请申请群四
标哥博客iOS交流群四 250351140 群四若已满,会有提示信息
关注微信公众号 iOSDevShares 关注微信公众号,会定期地推送好文章
关注新浪微博账号 标哥的技术博客 关注微博,每次发布文章都会分享到新浪微博
关注标哥的GitHub CoderJackyHuang 这里有很多的Demo和开源组件
关于我 进一步了解标哥 如果觉得文章对您很有帮助,可捐助我!
原文  http://www.henishuo.com/ios-cell-mutex-multiselect/
正文到此结束
Loading...