iOS tableviewCell的多行选择删除和全选删除_weixin_34260991的博客-程序员宅基地

技术标签: python  markdown  

 

 

记录一下项目中遇到的tableviewCell多行选择删除和全选删除。

1240

1240

1240

1240

效果图如上图

1 首先 创建数组

2 创建tableview 

self.tableView.editing = NO;//默认tableview的editing 是不开启的

3 全选和多选 删除按钮

//选择按钮

UIButton *selectedBtn = [UIButton buttonWithType:UIButtonTypeSystem];

selectedBtn.frame = CGRectMake(0, 0, 60, 30);

[selectedBtn setTitle:@"选择" forState:UIControlStateNormal];

[selectedBtn addTarget:self action:@selector(selectedBtn:) forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *selectItem = [[UIBarButtonItem alloc] initWithCustomView:selectedBtn];

self.navigationItem.rightBarButtonItem =selectItem;

//        全选

_selectAllBtn = [UIButton buttonWithType:UIButtonTypeSystem];

_selectAllBtn.frame = CGRectMake(0, 0, 60, 30);

[_selectAllBtn setTitle:@"全选" forState:UIControlStateNormal];

[_selectAllBtn addTarget:self action:@selector(selectAllBtnClick:) forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:_selectAllBtn];

self.navigationItem.leftBarButtonItem = leftItem;

_selectAllBtn.hidden = YES;

_baseView = [[UIView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height- 60, self.view.frame.size.width, 60)];

_baseView.backgroundColor = [UIColor grayColor];

[self.view addSubview:_baseView];

//删除按钮

_deleteBtn = [UIButton buttonWithType:UIButtonTypeCustom];

_deleteBtn.backgroundColor = [UIColor redColor];

[_deleteBtn setTitle:@"删除" forState:UIControlStateNormal];

_deleteBtn.frame = CGRectMake(0, 0, self.view.frame.size.width, 60);

[_deleteBtn addTarget:self action:@selector(deleteClick:) forControlEvents:UIControlEventTouchUpInside];

[_baseView addSubview:_deleteBtn];

4 tableview的delegate和datasource

//是否可以编辑  默认的时YES

-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{

return YES;

}

//选择编辑的方式,按照选择的方式对表进行处理

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{

if (editingStyle == UITableViewCellEditingStyleDelete) {//删除

//真正项目中做删除

//1.将表中的cell删除

//2.将本地的数组中数据删除

//3.最后将服务器端的数据删除

}

}

//选择你要对表进行处理的方式  默认是删除方式

-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{

return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert;

}

******//选中时将选中行的在self.dataArray 中的数据添加到删除数组self.deleteArr中

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

[self.deleteArr addObject:[self.dataArray objectAtIndex:indexPath.row]];

}

******//取消选中时 将存放在self.deleteArr中的数据移除

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath  {

[self.deleteArr removeObject:[self.dataArray objectAtIndex:indexPath.row]];

}

实现完tableview的代理方法 下面处理各个按钮的响应事件

1 首先是选择按钮的响应事件 在按钮事件里面要有self.tableView.allowsMultipleSelectionDuringEditing = YES; 允许支持同时选中多行

然后在点击的时候让tableview.editing = !tableview.editing 点击此按钮可切换tableview的编辑状态

- (void)selectedBtn:(UIButton *)button {

//支持同时选中多行

self.tableView.allowsMultipleSelectionDuringEditing = YES;

self.tableView.editing = !self.tableView.editing;

if (self.tableView.editing) {

_selectAllBtn.hidden = NO;

[button setTitle:@"完成" forState:UIControlStateNormal];

}else{

_selectAllBtn.hidden = YES;

[button setTitle:@"删除" forState:UIControlStateNormal];

}

}

 

2 全选按钮的响应事件

点击全选按钮时 要在这里选中所有的cell 我在网上看到很多资料都是选中当前可见的cell 我们项目要求是全部cell ,所以在这里我这样去做 在self.dataArray里面遍历, 然后找到对应的一共多少行, 获取索引值 indexPath,tableview有系统方法 [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop]; 选择全部的cell  此时在这个全选方法中将数据源self.dataArray的所有数据全部添加到self.deleteArr (存储删除数据的数组中)

//全选

- (void)selectAllBtnClick:(UIButton *)button {

//    [self.tableView reloadData];

for (int i = 0; i < self.dataArray.count; i ++) {

NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0];

[self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop];

[self.deleteArr addObjectsFromArray:self.dataArray];

}

NSLog(@"self.deleteArr:%@", self.deleteArr);

}

3 删除按钮的处理事件

无论是多行删除还是全部删除的数据对tableview的操作都是走这个delete方法的。在方法中判断当前的tableview是否处于编辑状态。然后再执行删除操作,关键点就是将数据源self.dataArray中的要删除的数据移除,之前我们的多选或者全选已经将我们要删除的数据存储在self.deleteArr中了 ,所以在这里我们用[self.dataArray removeObjectsInArray:self.deleteArr];这个方法操作 然后刷新tableview。至此就可以实现功能了。

 

- (void)deleteClick:(UIButton *) button {

if (self.tableView.editing) {

//删除

[self.dataArray removeObjectsInArray:self.deleteArr];

[self.tableView reloadData];

}

else return;

}

 

总结 :这里面一共有以下几个点 

1 在多选删除时 在didSelectRowAtIndexPath这个方法中,根据cell所在行的索引值将此行的数据存到self.deleteArr中 [self.deleteArr addObject:[self.dataArray objectAtIndex:indexPath.row]];

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

}

当取消删除时,要将self.deleteArr中的数据移除,不然会造成 (你先选中一行 然后取消选中 但是当你点击删除按钮时,这行cell还是会被删除)

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath  {

}

2 在全选时。将self.dataArr 中的全部数据都赋值给self.deleteArr

NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0];

[self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop];

[self.deleteArr addObjectsFromArray:self.dataArray];

3 执行删除操作时,将self.dataArr中包含self.deleteArr的数据移除

self.dataArray removeObjectsInArray:self.deleteArr];

[self.tableView reloadData];

 

后记:还有一个在cell中添加长按手势 使tableview进入编辑状态

在-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法中 为cell添加长按手势

UILongPressGestureRecognizer *longPressed = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressedAct:)];

longPressed.minimumPressDuration = 1;

[cell.contentView addGestureRecognizer:longPressed];

 

实现长按手势的响应方法:

-(void)longPressedAct:(UILongPressGestureRecognizer *)gesture

{

if(gesture.state == UIGestureRecognizerStateBegan)

{

CGPoint point = [gesture locationInView:self.tableView];

NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint:point];

if(indexPath == nil) return ;

//add your code here

self.tableView.editing = YES;

}

}

Markdown模式链接

转载于:https://my.oschina.net/mexiaobai1315/blog/783833

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34260991/article/details/92681210

智能推荐

OpenFlow与VxLAN在云网络的应用_cisco_eigrp的博客-程序员宅基地_openflow vxlan

我叫庞俊英,来自阿里巴巴技术保障部,我们部门负责整个阿里集团所有业务如蚂蚁、淘宝、阿里云等等业务部门的基础设施。两年前我来过这里,去年没来,因为觉得去年没什么可讲的,所以这次我向大家汇报内容的是有一个连续性的,就是我前年提了哪些问题,这些问题现在解决了吗?然后还有哪些问题还需要解决,我希望业界帮我们做什么,我会是这样一个思路来向大家汇报。我是个工程师,所以我的PPT里面如果有很漂亮的图,一

使用 Docker部署 Tensorflow Serving 模型服务_xiedelong的博客-程序员宅基地_docker部署tensorflow

准备工作拉取 tensorflow servering 的 docker 镜像:sudo docker pull tensorflow/serving,一般是已经有的进入到一个测试目录:cd /home/q/test_dir/然后下载官方Demo目录:git clone https://github.com/tensorflow/serving如果无法下载,去网站 down 下来(附件),然后 deploy 上传到 linux 实体机中部署启动sudo docker run -t --rm

利用docker 创建mysql_Docker创建Mysql容器的简单步骤_穆舍的博客-程序员宅基地

前言前面我们已经安装好了Docker,也简单了解了Docker。下面就来给大家介绍下Docker创建Mysql容器的简单步骤,话不多说了,来一起看看详细的介绍吧步骤如下1、启动docker服务[[email protected] ~]# systemctl start docker2、查看docker里面的镜像[[email protected] ~]# docker imagesREPOSITORY TAG IM...

AE要素选择(点选和拉框选择)_weixin_34414650的博客-程序员宅基地

选择一个要素或者一个要素集(FeatureSelection)的方法很多,如IMap::SelectByShape、ILayer::search、IFeatureSection::SelectFeature等方法主要用到的方法:IMap接口的SelectFeature(Layer, Feature) (方法,从一个Layer中选择一个Feature);IMap接口SelectBySha...

启发测试计划:上下文模型_TIB的博客-程序员宅基地

 启发测试计划:上下文模型陈能技2007-8-12 原文:原文:Heuristic Test Planning:Context Modal - James Bach  Context-Driven Planning 上下文驱动计划1、 明白谁会参与项目,他们发挥什么作用2、 明白GIVENS(给定的条件),并谈判决定给定的工作约束,明白给定的资源限制

重调SJA1000_动感小麦兜的博客-程序员宅基地_sja1000

从接触SJA1000到现在已经一年多了,去年2月份搞好了之后基本就没再动过,一直跑着之前的程序,没问题也没额外的收货。直到昨天,有人说要通过can总线传输温度,恰巧当时设计板子时预留了DS18B20的接口。起初测试时,温度在液晶上一直显示为0,于是怀疑单块板子在不进行can通信时可能会卡死,于是找了另一块板子,让两者通信时再读温度,还是不行。最后单独找了个测温度的程序,把液晶移植过去,结果液晶

随便推点

Android 开发者必备的书单_JeffreyLau7的博客-程序员宅基地

Android 方面的书籍可谓是百花齐放,这几本书的作者都是在一线互联网公司奋斗的工程师,他们把多年的工作经验,身心耕植,汇聚成一本书。作为菜鸟的我们,只有一睹大神的风采了。所以借这个周末,我也列举了一些书,作为一个Android 开发工程师,这些书都是不可多得的好书,书中知识迟早是要掌握的。我们都知道开发Android App 是用Java 语言的,当然你也可以使用其他语言来

循环商业模式为时尚产业带来7000亿美元商机_普通网友的博客-程序员宅基地

•到2030年,循环商业模式在全球时尚市场所占的份额有可能达到23%,这代表着7000亿美元的商机。•循环商业模式可以帮助时尚产业向更好的增长模式转变,使产业收入不再依赖生产和资源利用。•要让积极的经济和环境成果最大化,需要重新设计绩效指标、产品和供应网络以适应循环商业模式,并形成更大规模的循环商业模式。2021年11月23日艾伦·麦克阿瑟基金会(“基金会”)的最新研究发现,到2030年,在租赁和转售等领域,循环商业模式在全球时尚市场所占的份额有可能达到23%,蕴藏着7000亿美元的商机

html5 matrix,javascript - HTML5 Canvas get transform matrix? - Stack Overflow_weixin_39582569的博客-程序员宅基地

EDIT(1/10/2020): MDN now indicates that getTransform() is supported in most major browsers; the code below may still have value as a part of implementing a polyfill for Internet Explorer, Edge, and An...

怎样生活更有意义?_禅与计算机程序设计艺术的博客-程序员宅基地

怎样生活更有意义?简单生活。复杂的音乐产生放纵复杂的食品产生疾病,质朴的音乐文艺教育能产生心灵方面的节制。质朴的体育锻炼产生身体健康。节制自己的快乐。我们知道最大最强烈的快乐是色欲。而正确的爱,是对有秩序的事物和美的事物,有节制的、和谐的爱。我们不应该追求复杂的节奏和多样的韵律。我们应该考虑什么是有秩序的、勇敢的生活。在有秩序的社会里,每个人都有他应该干的工作。——柏拉图《理想国》每个人,一生只做...

Unity3d——4种灯光的简介_正版游戏的受害者的博客-程序员宅基地

灯光Light一、简介光源 (Lights) 是每个场景的重要组成部分。网格和纹理决定了场景的形状和外观,而光源则决定了三维环境的颜色和氛围。您可能会在每个场景中使用多个光源。让它们一起工作需要一些实践,但结果却相当惊人。二、灯光类型Unity 5.5中有 4 种灯光。创建灯光的方式同创建其他游戏对象的方式相似:(1)Directional方向光源。这种类型的灯光可以被放...

川师大java试卷_成都大学Javaweb期末试卷总结版_九十纳魔狼的博客-程序员宅基地

成都大学期末试卷四、编程题(共15分)第一个Servlet1文件,读取一个请求参数test(字符串),存放在请求范围内,然后把请求转发给第二个Servlet2.。第二个Servlet2文件(url为output),向客户输出Servlet1的结果。根据注释补充下列代码。(15分)public class Servlet1 extends HttpServlet {public void servi...

推荐文章

热门文章

相关标签