• UITableViewCell 多选和全选(checkBoxCell)


    思路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;
    }
    将来的自己,会感谢现在不放弃的自己!
  • 相关阅读:
    Python3 面向对象小练习
    Python3 面向对象进阶1
    Python3 类的继承小练习
    Python3 类的继承
    Python3 数据结构之词频统计(英文)
    Python3 类与对象之王者荣耀对战小游戏
    Python3 类与对象
    SQL优化单表案例
    SQL性能分析
    索引简介
  • 原文地址:https://www.cnblogs.com/TheYouth/p/5452781.html
Copyright © 2020-2023  润新知