UITableView的多选特殊处理

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
其中"MyTableViewCell"这是通过XIB定制的cell,简单事简单做.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容