博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UITableViewCell 多选和全选(checkBoxCell)
阅读量:5315 次
发布时间:2019-06-14

本文共 9407 字,大约阅读时间需要 31 分钟。

思路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传给上一个点击的indexPathGMeSaleAreaViewModel *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 ()
{ 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 ()
{ 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;}

 

转载于:https://www.cnblogs.com/TheYouth/p/5452781.html

你可能感兴趣的文章
介绍Win7 win8 上Java环境的配置
查看>>
移动、联通和电信,哪家的宽带好,看完你就知道该怎么选了!
查看>>
Linux设置环境变量的方法
查看>>
Atitit.进程管理常用api
查看>>
构建自己的项目管理方案
查看>>
利用pca分析fmri的生理噪声
查看>>
div水平居中且垂直居中
查看>>
怎么在windows7系统我的电脑中添加快捷方式
查看>>
epoll使用具体解释(精髓)
查看>>
AndroidArchitecture
查看>>
原生JavaScript第六篇
查看>>
安装Endnote X6,但Word插件显示的总是Endnote Web"解决办法
查看>>
python全栈 计算机硬件管理 —— 硬件
查看>>
大数据学习
查看>>
简单工厂模式
查看>>
Delphi7编译的程序自动中Win32.Induc.a病毒的解决办法
查看>>
Objective-C 【关于导入类(@class 和 #import的区别)】
查看>>
倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办...
查看>>
【转】javascript 中的很多有用的东西
查看>>
Centos7.2正常启动关闭CDH5.16.1
查看>>