UITableView的多选特殊处理

2017-01-09  本文已影响54人  ChangeWorld

tableView的多选多见于"全选" "乱序多选" "反选"和 "单选" 等场景, 不过最近有个需求,需要拖动进度条般的选中,不能间断的那种,就是随心所欲,选中到哪里前面的cell也要跟着选中...

描述需求:

基于此,我开始在网上疯狂的找轮子,希望用最快的时间,最少的代价去改造一个新的功能,也许这是为自己不写重复代码找借口吧,想怎样就怎样吧,就这样干了

#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,简单事简单做.
上一篇下一篇

猜你喜欢

热点阅读