iOS多選Cell處理互斥問題

VicNnt 8年前發布 | 15K 次閱讀 iOS開發 移動開發

來自: 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

關注我

<th width="25%">賬號</th>

<th width="46%">備注</th>

</tr>

</thead>

<td>324400294(滿)</td>

<td>群一若已滿,請申請群二</td>

</tr>

</tbody>

</table> </div>

 本文由用戶 VicNnt 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
關注
標哥博客iOS交流群一
標哥博客iOS交流群二 494669518 群二若已滿,請申請群三
標哥博客iOS交流群三 461252383(滿) 群三若已滿,請申請群四
標哥博客iOS交流群四 250351140 群四若已滿,會有提示信息
關注微信公眾號 iOSDevShares 關注微信公眾號,會定期地推送好文章
關注新浪微博賬號 標哥的技術博客 關注微博,每次發布文章都會分享到新浪微博
關注標哥的GitHub CoderJackyHuang 這里有很多的Demo和開源組件
關于我 進一步了解標哥 如果覺得文章對您很有幫助,可捐助我!
  • sesese色