首页 > 技术文章 > UITableViewCell 多选和全选(checkBoxCell)

TheYouth 2016-05-02 18:10 原文

思路1

 一、单选

1、创建一个currentIndexPath为了记录当前选择的indexPath。
2、 如果是记录上一次选中的内容,可以通过模型中的是否选中来初始化indexPathForRow。
3、首先判断创建的indexPath是否等于当前点击的indexPath。
4、如果不等于数组中的模型全部置为NO。
5、再将当前点击的indexPath传给创建的currentIndexPath,并刷新当前表格(传创建的currentIndexPath)。
6、通过点击的indexPath取出当前模型并取反,再通过点击的indexPath刷新表格
代码如下:
1、_indexPath = [NSIndexPath indexPathForRow:[group.brand indexOfObject:viewModel] inSection:[_dataArray indexOfObject:group]];//取出选中的行及列,viewModel表示是选中的模型,如果进入页面不需要设置上一次选中的内容可以不写这一步。
2、NSIndexPath *selectIndexPath = _indexPath;
   if (selectIndexPath && selectIndexPath != indexPath) {//判断创建的indexPath是否不等于点击的indexPath
       for (GMeSaleAreaGroupViewModel *GviewModel in _dataArray) {//如果不等于置为NO
          for (GMeSaleAreaViewModel*viewModel  in GviewModel.brand) {
                 viewModel.isSelect = NO;
             }
         }
//刷新没有选中的表格
    [tableView reloadRowsAtIndexPaths:@[_indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
  }
_indexPath = indexPath; //点击的indexPath传给上一个点击的indexPath
GMeSaleAreaViewModel *viewModel = [GroupViewModel.brand objectAtIndex:indexPath.row]; //取出当前点击的indexPath
viewModel.isSelect = !viewModel.isSelect;//取反 [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];//刷新当前点击的表格

  

二、全选

  1.创建可变数组,存储所有未选中状态(NO)的布尔值按钮,点击时改变其状态,并传入按钮的状态。

 三、多选

  1.创建Cell时,从数组中取出相应的值,传给cell,如果为YES,否则为NO.

  2.点击cell时,从数组中取出相应的值,取反,然后刷新该行。

四、代码先行

#import "ViewController.h"
#import "CheckBoxCell.h"
@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>{
    
    UITableView *_tableView;
}
@property (nonatomic, strong)NSMutableArray      *dataArray;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self loadUI];
    [self loadDataWithSelected:NO];
}
- (void)loadUI{
    
    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 50,self.view.bounds.size.width,self.view.bounds.size.height - 50) style:UITableViewStylePlain];
    _tableView.delegate = self;
    _tableView.dataSource = self;
    [self.view addSubview:_tableView];
    
    UIButton *customBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    [customBtn setFrame:CGRectMake(50,0 , 200, 50)];
    [customBtn setBackgroundColor:[UIColor lightGrayColor]];
    [customBtn setTitle:@"多选" forState:UIControlStateNormal];
    [customBtn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
    [customBtn setTitle:@"全选" forState:UIControlStateSelected];
    [customBtn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:customBtn];
}
- (void)loadDataWithSelected:(BOOL)isSelected{
    
    NSMutableArray *arr = [NSMutableArray array];
    for (NSInteger i = 0; i< 20; i++) {
        [arr addObject:@(isSelected)];
    }
    self.dataArray = arr;
    [_tableView reloadData];
}
- (void)btnClick:(UIButton *)sender{
    
    [self loadDataWithSelected:sender.selected];
    sender.selected = !sender.selected;

}
#pragma mark --- tableview
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return self.dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    static NSString *ID = @"checkBoxCell";
    CheckBoxCell *cell  = [tableView dequeueReusableCellWithIdentifier:ID];
    if (cell == nil) {
        cell  = [[CheckBoxCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
    }
    if (self.dataArray.count > indexPath.row) {
        NSNumber *selected = [self.dataArray objectAtIndex:indexPath.row];
        [cell setChecked:selected.boolValue];
    }
    return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
    if (self.dataArray.count > indexPath.row) {
        NSNumber *selected = self.dataArray [indexPath.row];
        self.dataArray[indexPath.row] = @(!selected.boolValue);
        [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
   
}

cell代码同下;

思路2

原文地址: http://www.cnblogs.com/hxwj/p/4532172.html

思路分析

前期准备:1.创建两个数组:一个数据数组array,一个状态数组checkArray,(初始化时每一个值为NO).

     2.多选,初始化时存入所有NO值给checkArray,点击cell时取出每一值取反,全选则是根据按钮状态,如果是选中全部为YES,否则全部为NO。

一.全选

  1.点击时反选按钮状态,取出所有indexPath未选中状态给新的数组,然后遍历取出相应的indexpath,cell和row;

      2.取出每一个值,如果是选中,设置为YES,否则设置为NO.

二.多选(点击cell时,取出相应的row和cell,根据row从checkArray取出一项,并设置cell状态)

  1.当cell点击时,根据点击cell的row从checkArray取出相应的项,改变其值,如果是YES,设置为YES,否则设置为NO。

三.代码先行

cell

#import "CheckBoxCell.h"
@interface CheckBoxCell(){
    
    BOOL        _isSelect;
    UIImageView *_chectImageView;
    
}
@end
@implementation CheckBoxCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    if (self == [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        
        _chectImageView = [[UIImageView alloc] init];
        _chectImageView.image = [UIImage imageNamed:@"normal"];
        [self.contentView addSubview:_chectImageView];
    }
    return self;
}

- (void)layoutSubviews{
    
    [super layoutSubviews];
    [_chectImageView setFrame:CGRectMake(10, 10,30, 30)];
}
- (void)setchecked:(BOOL)checked{
    
    _isSelect = checked;
    if(_isSelect){
        
        _chectImageView.image = [UIImage imageNamed:@"select"];
    }else{
        _chectImageView.image = [UIImage imageNamed:@"normal"];
    }
  

VIewControll

#import "ChectBoxViewController.h"
#import "CheckBoxCell.h"
@interface ChectBoxViewController ()<UITableViewDelegate,UITableViewDataSource>{
    
    
    UITableView   *_tableView;
}
@property (nonatomic, strong)NSArray *array;
@property (nonatomic, strong)NSMutableArray *chectArray;
@end

@implementation ChectBoxViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self loadUI];
    [self loadData];
}
#pragma mark --- viewDidLoad
- (void)loadUI{
    
    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0,50, self.view.bounds.size.width, self.view.bounds.size.height) style:UITableViewStylePlain];
    _tableView.delegate = self;
    _tableView.dataSource = self;
    [_tableView setBackgroundColor:[UIColor lightGrayColor]];
    [self.view addSubview:_tableView];
    
    
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    [btn setTitle:@"多选" forState:UIControlStateNormal];
    [btn setTitle:@"全选" forState:UIControlStateSelected];
    [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
    [btn setFrame:CGRectMake(10, 10, 100, 50)];
    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [self.view addSubview:btn];
}
- (void)loadData{
    
    _chectArray = [NSMutableArray array];
    for (NSInteger i = 0; i < self.array.count; i++) {
        NSMutableDictionary *dic = [NSMutableDictionary dictionary];
        [dic setValue:@"NO" forKey:@"checked"];
        [_chectArray addObject:dic];
    }
}
#pragma mark --- tableView
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return self.array.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    static NSString *ID = @"checkboxCell";
    CheckBoxCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    if (cell == nil) {
        cell = [[CheckBoxCell  alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
    }
    return  cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
     CheckBoxCell*cell = (CheckBoxCell *)[tableView cellForRowAtIndexPath:indexPath];
    NSInteger row = indexPath.row;
    [self cellChecked:cell row:row isSelected:YES];
}

#pragma mark --- response methods
/**
 *  点击,和加载cell的时候进行判断,从而改变cell的选中状态
 *
 *  @param cell     自定义cell
 *  @param row      tableView的下标
 *  @param selected 是否是点击
 */
- (void)cellChecked:(CheckBoxCell *)cell row:(NSInteger)row isSelected:(BOOL)selected{
    
    
    NSMutableDictionary *dic = [_chectArray objectAtIndex:row];
    if ([[dic objectForKey:@"checked"] isEqualToString:@"NO"]) {
        if (selected) {
            [dic setObject:@"YES" forKey:@"checked"];
            [cell setchecked:YES];
        }
    }else{
        
        if (selected) {
            [dic setObject:@"NO" forKey:@"checked"];
            [cell setchecked:NO];
        }
    }
}
- (void)btnClick:(UIButton *)sender{//全选
    
    sender.selected = !sender.selected;
    
    NSArray *arrayOfIndexPath = [NSArray arrayWithArray:[_tableView indexPathsForVisibleRows]];
    for (NSInteger i = 0; i < arrayOfIndexPath.count; i++) {
        NSIndexPath *indexPath = [arrayOfIndexPath objectAtIndex: i];
        CheckBoxCell *cell = (CheckBoxCell *)[_tableView cellForRowAtIndexPath:indexPath];
        NSUInteger row = [indexPath row];
        NSMutableDictionary *dic = [_chectArray objectAtIndex:row];
            if (sender.selected) {
                [dic setObject:@"YES" forKey:@"checked"];
                [cell setchecked:YES];
            }else{
                [dic setObject:@"NO" forKey:@"checked"];
                [cell setchecked:NO];
            }
        }
}
- (NSArray *)array{
    if (_array == nil) {
        _array = [[NSMutableArray alloc] initWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
    }
    return _array;
}

 

推荐阅读