iOS多選Cell處理互斥問題
來自: 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交流群一 | ||
標哥博客iOS交流群二 | 494669518 | 群二若已滿,請申請群三 |
標哥博客iOS交流群三 | 461252383(滿) | 群三若已滿,請申請群四 |
標哥博客iOS交流群四 | 250351140 | 群四若已滿,會有提示信息 |
關注微信公眾號 | iOSDevShares | 關注微信公眾號,會定期地推送好文章 |
關注新浪微博賬號 | 標哥的技術博客 | 關注微博,每次發布文章都會分享到新浪微博 |
關注標哥的GitHub | CoderJackyHuang | 這里有很多的Demo和開源組件 |
關于我 | 進一步了解標哥 | 如果覺得文章對您很有幫助,可捐助我! |