UITableView的多选特殊处理
2017-01-09 本文已影响54人
ChangeWorld
tableView的多选多见于"全选" "乱序多选" "反选"和 "单选" 等场景, 不过最近有个需求,需要拖动进度条般的选中,不能间断的那种,就是随心所欲,选中到哪里前面的cell也要跟着选中...
描述需求:
- 1 分期支付,一年12个月,默认选中第一个月
- 2 付完一期,则这一期消失,第二期变成第一期显示(主要通过后台,前台不需要怎么处理,取得数据源显示即可)
- 3 灵活支付,可支付多期,选择到哪一期,那么前面的期数也会被选中. 比如: 选中第一期,那么第一期被选中(毫无意义可言) --- 选中第三期,则第一,二,三期都被选中...以此类推,选择第十二期,就好比全选.
- 4 将已支付的期数,显示到tableView的另一个分组(洒洒水而已啦)
基于此,我开始在网上疯狂的找轮子,希望用最快的时间,最少的代价去改造一个新的功能,也许这是为自己不写重复代码找借口吧,想怎样就怎样吧,就这样干了
#import "ViewController.h"
#import "MyTableViewCell.h"
///MARK: -这是一个简单的记录状态的模型
@interface Item : NSObject
@property (retain, nonatomic) NSString *title;
@property (assign, nonatomic) BOOL isChecked;
@end
@implementation Item
@end
/// MARK: -控制器代码
@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (retain, nonatomic) NSMutableArray *items;
@end
///cell是一个图片和一个label 根据isChecked显示不同图片渲染选中状态
static NSString *CellID = @"MyTableViewCell";
@implementation ViewController
- (NSMutableArray *)items
{
if (_items==nil) {
_items =[[NSMutableArray alloc]init];
}
return _items;
}
- (void)viewDidLoad {
[super viewDidLoad];
for (int i=0; i< 12; i++) {
Item *item = [[Item alloc] init];
item.title = [NSString stringWithFormat:@"第%d期",i+1];
item.isChecked = NO;
[self.items addObject:item];
}
[self.tableView registerNib:[UINib nibWithNibName: CellID bundle:nil ] forCellReuseIdentifier: CellID];
}
#pragma mark- UITableViewDelegate
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.items count];
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewCellEditingStyleNone;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyTableViewCell *cell = (MyTableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellID];
Item* item = [_items objectAtIndex:indexPath.row];
if(indexPath.row == 0){
item.isChecked = YES;
}
cell.myTextLabel.text = item.title;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
[cell setChecked:item.isChecked];
return cell;;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
for (NSInteger i = 0; i <= indexPath.row; i++) {//比选择的还前面的就选中
Item* item = self.items[i] ;
MyTableViewCell *cell = (MyTableViewCell*)[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
item.isChecked = YES;
/// 根据模型的状态显示不同的图片 通过修改数据源渲染界面,这样才不至于导致cell复用 (重影现象即显示不正确)
[cell setChecked:item.isChecked];
}
for (NSInteger j = indexPath.row+1 ; j<_items.count; j++) {//比选择的还后面的就取消选中
Item* item = self.items[j] ;
MyTableViewCell *cell = (MyTableViewCell*)[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow: j inSection:0]];
item.isChecked = NO;
[cell setChecked:item.isChecked];
}
[self.tableView reloadData];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
@end