iOS多选Cell处理互斥问题

VicNnt 8年前

来自: http://www.henishuo.com/ios-cell-mutex-multiselect/

前言

今天在 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一定要反选。如下效果图:

关键代码

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

   - (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互不干扰。

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

提示

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

源代码

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

关注我

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