思路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(, ,self.view.bounds.size.width,self.view.bounds.size.height - ) style:UITableViewStylePlain];
_tableView.delegate = self;
_tableView.dataSource = self;
[self.view addSubview:_tableView]; UIButton *customBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[customBtn setFrame:CGRectMake(, , , )];
[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 = ; i< ; 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(, ,, )];
}
- (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(,, 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(, , , )];
[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[self.view addSubview:btn];
}
- (void)loadData{ _chectArray = [NSMutableArray array];
for (NSInteger i = ; 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 = ; 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:@"",@"",@"",@"",@"", nil];
}
return _array;
}

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

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

    还是在上一个程序的基础上进行修改 1.反选按钮 2.全选按钮 3.删除按钮 4.其他代码优化 1.反选按钮 反选的过程就是将_deleteShops数组中得数据清空,然后将Shops中数组添加到_de ...

  2. js 复选框 全选都选 如果某一个子复选框没选中 则全选按钮不选中

    <!DOCTYPE HTML> <html> <head> <meta charset=UTF-8> <title>js 复选框 全选都选 ...

  3. CheckBox复选框全选以及获取值

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  4. JavaScript小例子:复选框全选

    JavaScript小例子:复选框全选 这只是一个小例子,很简单,但是这个功能还是很常用的: 实现后效果如图: JavaScript代码: <script type="text/jav ...

  5. Jquery表格变色 复选框全选,反选

    /*jquery静态表格变色*/ $(".tr2").mouseover(function(){ $(this).css("background"," ...

  6. 复选框全选、全不选和反选的效果实现VIEW:1592

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  7. Jquery CheckBox复选框 全选/取消全选 最佳实现方式 参考案例

    <input id="chkAll" type="checkbox" />全选/取消全选</div> <asp:Repeater ...

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

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  9. checkbox复选框全选批量删除

    多选框全选实现批量删除 html代码 <body> <form action="" method="post" name="Form ...

  10. 关于在repeater中的checkbox实行多选和全选

    今天项目中用到这一块,是一个b2b商城,业务是别人给客户留言后,客户从会员中心的留言管理中查看,用checkbox实行多选和全选后进行批量审核 首先在checkbox后加个hidden,作用见代码: ...

随机推荐

  1. Android Studio常用快捷键

    Ctrl+U :如果你的光标在重写父类的一个方法内(如:Activity#onCreate()),这个将会跳到父类的实现上. 如果你的光标在类名上,它将会跳到父类. Ctrl+Alt+Home:它可以 ...

  2. 【读书笔记】iOS-ASIHTTPRequest框架的使用。

    一,安装和配置ASIHTTPRequest框架. 二,同步请求. 在ASIHTTPRequest框架中与HTTP请求相关的类有:ASIHTTPRequest和ASIFormDataRequest,其中 ...

  3. Android实现欢迎界面,点击进入应用

    在主线程中开启一个新线程,每隔100ms检查一下时间是否到达自己预设的显示时间,到达则进入应用 实现屏幕的触摸事件,当触摸的时候,进入应用 package com.example.administra ...

  4. Strange Problem O(∩_∩)O~

    题目描述: 古代某个狱卒某天闲着没事想和两个罪犯玩个游戏,他找了个国际象棋盘,每个格子放上一个硬币,硬币长得都一样,正反都是狱卒自己决定. 之后他只让A罪犯观看棋盘,并随便指一个硬币告诉A罪犯,只要B ...

  5. java 语言规范 java language specifications

    在线地址: https://docs.oracle.com/javase/specs/ java语言规范下载: 链接:http://pan.baidu.com/s/1miEpJwk 密码:f89v j ...

  6. 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式

    PS:下面是性能测试的主要概念和计算公式,记录下: 一.系统吞度量要素: 一个系统的吞度量(承压能力)与request对CPU的消耗.外部接口.IO等等紧密关联.单个reqeust 对CPU消耗越高, ...

  7. sqlserver删除所有表(表结构和数据)

    要删除某个数据库,或者删除数据库中的所有表(删除表结构和数据),需要先删除表间的外键约束,才能删除表.如删除数据库db_wy中的所有表: --/第1步**********删除所有表的外键约束***** ...

  8. Hessian 二进制RPC协议框架

    Hessian是一个由Caucho Technology开发的轻量级二进制RPC协议. 和其他Web服务的实现框架不同的是,Hessian是一个使用二进制轻量级的Web服务协议的框架,免除了许多附加的 ...

  9. SQL动态列查询

    数据库中为了实现表格数据的自由设置,我们经常设计纵表,或者列定义的表(如下KeyValue),定义一个列超级多的表中每个字段的意义. 但是在设计时简单的东西却很容易被人们忘记,如下一个简单但是很松散的 ...

  10. SQL Server调优系列基础篇(并行运算总结篇二)

    前言 上一篇文章我们介绍了查看查询计划的并行运行方式. 本篇我们接着分析SQL Server的并行运算. 闲言少叙,直接进入本篇的正题. 技术准备 同前几篇一样,基于SQL Server2008R2版 ...