美文网首页
UITableView的多选特殊处理

UITableView的多选特殊处理

作者: ChangeWorld | 来源:发表于2017-01-09 00:20 被阅读54次

    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,简单事简单做.

    相关文章

      网友评论

          本文标题:UITableView的多选特殊处理

          本文链接:https://www.haomeiwen.com/subject/bsycbttx.html