< 返回首页

标哥的笔记,是记录在日常学习技术和日常开发中那些年遇到过的坑!本站为新站,原"标哥的技术博客"中的文章会慢慢移到本站,欢迎收藏本站!
在使用本站过程中,有任何建议请联系标哥! 另,承接App开发、网站开发和微信小程序开发!欢迎联系我们


iOS多选Cell处理互斥问题

 作者:标哥    发布日期:2017-01-12 23:33    阅读量:832次
 

reviewcode收到一份订单,本来以为只是进行Code Review,没有想到是帮忙解BUG。针对这个问题,我写了一个demo,并写下本篇文章,提供解决的思路。

在tableview的cell的多选题的情况下,有互斥的功能,根据RecordTwoLevelModel里面的参数strMutex_id,就是跟这个选项互斥的选项的id,这个bug就是选项之间现在不能互斥。

更详细地问题描述可以看这里:问题详细描述。这是接收订单后对需求者所确认的问题描述。

数据建模

@interface HYBTestModel : NSObject

// 问题id
@property (nonatomic, copy) NSString *qid;
@property (nonatomic, copy) NSString *questionSummary;
// 修改为strong声明,当然使用copy也没有关系,因为我重写了getter方法,
// 当然这里应该声明为readonly更佳一些。
@property (nonatomic, strong) NSMutableArray *optionalAnswers;

@end

@interface HYBOptionalAnswerModel : 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一定要反选。如下效果图:

image

关键代码

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

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  HYBTestModel *model = [self.datasource objectAtIndex:indexPath.section];
  HYBOptionalAnswerModel *answerModel = [model.optionalAnswers objectAtIndex:indexPath.row];
  
  answerModel.isSelected = !answerModel.isSelected;
  
  // 这里假设的是互斥是单一的,也就是说不存在多个相互互斥的状态。这里只考虑A/B/C/D中A/B/C都到D互斥的情况
  if (answerModel.isSelected) {
    for (HYBOptionalAnswerModel *otherAnswerModel in model.optionalAnswers) {
      if (otherAnswerModel != answerModel && [answerModel.mutexIds containsObject:otherAnswerModel.aid]) {
        // 互斥
        otherAnswerModel.isSelected = !answerModel.isSelected;
      }
    }
  }
  
  [tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section]
           withRowAnimation:UITableViewRowAnimationFade];
}

A与B互斥、C与D互斥

我们再来看看A与B互斥、C与D互斥的例子。如果选A就不能选B,选B就不能先A;同样选C就不能选D,选D就不能先C。但是AB与CD互不干扰。

image

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

小结

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

大家可以到看问题发起点看吧!

源代码

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


承接:ThinkPHP项目开发、网站项目开发、微信项目开发、微信小程序项目开发、App开发,欢迎联系标哥QQ632840804