UITableViewCell 多选和全选(checkBoxCell)

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

思路分析

前期准备:1.创建两个数组:一个是真正数据的不可变数组array,一个是自定义可变数组checkArray,(存储一个key对应array.count个value,值为NO).

     2.给cell创建两个属性:一个用来存储多选或全选的状态,一个用来控制选中和未选中。

       3.在cell中给外界暴露一个设置状态方法,然后根据外界传进来的状态来设置不同的图像状态。

一.全选

  1.这里使用按钮的选中和未选中状态来控制,点击时反选状态。

  2.把tableView中所有未选中cell的indexPath存储给一个不可变数组[_tableView indexPathsForVisibleRows]。

  3.然后遍历这个数组,分别取出cell,row,indexPath;然后通过row从checkArray取出每一项。

  4.如何按钮为选中状态设置value值为YES,并设置cell状态为YES,否则value值为NO,并设置cell的状态为NO.

二.多选

  1.当cell点击时调用一个自定义的方法,传入cell,row,还有是否是点击状态。

  2.通过row从checkArray数组取出一个字典,然后判断这个字典的key的value值。

  3.如果是NO的话,设置为YES,否则设置为NO.

以下是原文的思路:

  (3.如果是NO的话,如果是单击设置为YES,并设置cell的状态为YES,否则设置为NO.

  4.如果是YES的话,如果是单击设置为NO,并设置cell的状态为NO,否则设置为YES.)

三.贴代码

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;
}
时间: 2024-10-02 11:41:26

UITableViewCell 多选和全选(checkBoxCell)的相关文章

IOS开发学习笔记029-反选、全选、删除按钮的实现

还是在上一个程序的基础上进行修改 1.反选按钮 2.全选按钮 3.删除按钮 4.其他代码优化 1.反选按钮 反选的过程就是将_deleteShops数组中得数据清空,然后将Shops中数组添加到_deleteShops数组 添加一个 UIBarButtonItem 按钮,绑定响应事件. 代码如下 1 // 反选 2 - (void)unSelected 3 { 4 // 1.记录shops数组的长度和_deleteShops的长度 5 NSInteger shopsCount = _shops.

html+css+js实现复选框全选与反选

1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2 <html> 3 <head> 4 <title>html+css+js实现复选框全选与反选</title> 5 <meta http-equiv="content-type&qu

jQuery 复选框全选/取消全选/反选

jQuery实现的复选框全选/取消全选/反选及获得选择的值. 完整代码: <!DOCTYPE html> <html> <head> <script type="text/javascript" src="../js/jquery-1.9.1.js"></script> <script type="text/javascript"> $(document).ready(fun

全选/取消全选那点事

今天我花了半天时间处理checkbox全选/取消全选那点事 技术领域 可信计算 其他   全选 申请日 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016  年  至 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 至今 年 专利类型 发明专利 实用新型   全选 授权

javascript实现复选框全选和取消代码分析

javascript实现复选框全选和取消代码分析:复选框是常用的元素之一,而点击实现全选和取消全选又是最为常用的功能,特别是在批量操作管理中,非常的方便,下面就通过代码实例介绍一下如何实现此效果,代码实例如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.soft

复选框全选、全不选和反选的效果实现

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>石家庄车库棚|tongtianty.net---复选框全选.全不选和反选的效果实现</title> <SCRIPT LANGUAGE="JavaScript"> <!-- Begin func

jquery全选/取消全选(反选)/单选操作

使用jQuery实现一组checkbox全选/取消全选,代码很简洁. jquery版本:2.0 先看看HTML代码,很简单的操作框 </head> <body>    <div>        <input id="checkAll" type="checkbox" />全选        <input name="subBox" type="checkbox" />

jQuery实现复选框全选/全部取消/反选/获得选择的值

本地单文件上传脚本,命名uf 这是在本机上做的测试,利用bpcs_uploader脚本实现,只是进行简单的封装,自动完善云端文件路径. 技术要点:使用dirname获取文件所在目录,使用pwd获取文件完整路径,并作为云端文件路径. #!/bin/bash cur_dir=$(cd "$(dirname "$1")"; pwd) name=$(basename "$1") /home/grm/bin/bpcs_uploader/bpcs_uploa

jQuery 表单应用:全选/取消全选,表单验证,网页选项卡切换

应用一:单行文本框应用 需要用到的 API focus([[data],fn])   --> 当元素获得焦点时,触发 focus 事件 blur([[data],fn])     --> 当元素失去焦点时,触发 blur 事件 <!DOCTYPE html> <html> <head lang="en">     <meta charset="UTF-8">     <title></ti