一些列表经常需要编辑多选的功能,而UITableview自带多选删除的功能,使用起来方便,不需要自己去做数据存储和选中状态转换,可以减少不少开发时间。下面就来介绍下UITableView多选的使用。
效果 :

 
UITableViewCellEditingStyle

编辑状态UITableViewCellEditingStyle有三种模式:

  • UITableViewCellEditingStyleDelete
  • UITableViewCellEditingStyleInsert
  • UITableViewCellEditingStyleNone

多选框的风格, 只需要风格同时包含UITableViewCellEditingStyleDelete和UITableViewCellEditingStyleInsert就可以了

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert;
}

然后设置UITableview的Editing状态,就可开启tableview的多选功能。

使用自带的编辑状态去做多选功能的好处

  • 不用去记录数据源中选中的数组,通过indexPathsForSelectedRows方法就可以获取到选中的cell,做删除操作时也会方便很多.
  • 进入退出编辑状态方便,还有自带的动画。ps:自定义cell时,子视图应加载在cell的contentView上。
  • 在要求不高的情况下,自带的图标就能满足需求。
 
 
接下来先说说全选和全不选的操作,以下都是在单section情况下
  • 做全选也简单,遍历一遍数据源 然后选中每一条。
[self.listData enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:idx inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone];
}];
  • 全不选,reload就可以变为全不选状态了,如果不想reload这样简单粗暴的,也可以取出当前选中的indexpath数组,遍历反选也可以。
        [self.tableView reloadData];
/** 遍历反选
[[self.tableView indexPathsForSelectedRows] enumerateObjectsUsingBlock:^(NSIndexPath * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[self.tableView deselectRowAtIndexPath:obj animated:NO];
}];
*/
  • 多section情况类似,在删除操作的时候注意点,删除到section的cell到最后一个时 需要删除整个section。
编辑操作,下面以删除为例
NSMutableIndexSet *insets = [[NSMutableIndexSet alloc] init];
[[self.tableView indexPathsForSelectedRows] enumerateObjectsUsingBlock:^(NSIndexPath * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[insets addIndex:obj.row];
}];
[self.listData removeObjectsAtIndexes:insets];
[self.tableView deleteRowsAtIndexPaths:[self.tableView indexPathsForSelectedRows] withRowAnimation:UITableViewRowAnimationFade]; /** 数据清空情况下取消编辑状态*/
if (self.listData.count == 0) {
self.navigationItem.rightBarButtonItem.title = @"编辑";
[self.tableView setEditing:NO animated:YES];
[self showEitingView:NO];
/** 带MJ刷新控件重置状态
[self.tableView.footer resetNoMoreData];
[self.tableView reloadData];
*/
}
Cell点击效果的问题,有的人会觉得那个蓝色的背景很难看,想去掉,可以在自定义的cell里面:
self.multipleSelectionBackgroundView = [UIView new];

还可以修改有点击选中图标的颜色,其他默认图片的颜色也会因此而修改,

self.tintColor = [UIColor redColor];

效果:

 
 

如果不想使用默认图标的话,也可以在自定义:

-(void)layoutSubviews
{
for (UIControl *control in self.subviews){
if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellEditControl")]){
for (UIView *v in control.subviews)
{
if ([v isKindOfClass: [UIImageView class]]) {
UIImageView *img=(UIImageView *)v;
if (self.selected) {
img.image=[UIImage imageNamed:@"xuanzhong_icon"];
}else
{
img.image=[UIImage imageNamed:@"weixuanzhong_icon"];
}
}
}
}
}
[super layoutSubviews];
} //适配第一次图片为空的情况
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
[super setEditing:editing animated:animated];
for (UIControl *control in self.subviews){
if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellEditControl")]){
for (UIView *v in control.subviews)
{
if ([v isKindOfClass: [UIImageView class]]) {
UIImageView *img=(UIImageView *)v;
if (!self.selected) {
img.image=[UIImage imageNamed:@"weixuanzhong_icon"];
}
}
}
}
} }

效果:

 
 

demo地址:https://github.com/yxsufaniOS/TableViewMutableSelectDemo

链接:https://www.jianshu.com/p/a6e4cb42dd03

iOS UITableView的多选的更多相关文章

  1. UITableView 自定义多选

    前言 在上一篇文章中介绍了UITableView的多选操作,有提到将 return UITableViewCellEditingStyleDelete | UITableViewCellEditing ...

  2. iOS UITableView划动删除的实现

    标签:划动删除 iphone 滑动删除 ios UITableView 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://rainb ...

  3. IOS UITableView NSIndexPath属性讲解

    IOS UITableView NSIndexPath属性讲解   查看UITableView的帮助文档我们会注意到UITableView有两个Delegate分别为:dataSource和deleg ...

  4. iOS UITableView Tips(2)

    #TableView Tips(2) (本来想一章就结束TableView Tips,但是发现自己还是太天真了~too young,too simple) ##架构上的优化 在Tips(1)中指出了一 ...

  5. IOS UITableView多选删除功能

    UITbableView作为列表展示信息,除了展示的功能,有时还会用到删除,比如购物车.收藏列表等. 单行删除功能可以直接使用系统自带的删除功能,当横向轻扫cell时,右侧出现红色的删除按钮,点击删除 ...

  6. ios UITableView多选删除

    第一步, - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath ...

  7. iOS开发-UITableView单选多选/复选实现1

    TableView怎样实现单选或者多选呢? 我们的直接思路是改动某一个Cell的样式就可以, 那么改动样式须要通过改动相应的数据, 从这里能够判断我们须要给Cell相应的数据设置一个标志位, 当选中的 ...

  8. iOS - UITableView 多选功能实现

    :自定义Cell中的代码 #import <UIKit/UIKit.h> @interface TestCell : UITableViewCell @property(nonatomic ...

  9. iOS UITableView的使用 (选自oschina)

    1.新手篇创建tableView   http://my.oschina.net/joanfen/blog/203041 2.进阶篇列表中行的操作   http://my.oschina.net/jo ...

随机推荐

  1. 【搬运】Tea算法Java实现工具类

    最近在做数据加密,目标是实现平台app的数据安全性,所以准备使用AES+Base64进行加密,适逢一个特长的json串AES加密不了,于是在谷歌了各种算法,判断是否合用,参见 各种加密算法比较 一文中 ...

  2. 我在vs文本编辑中常用的快捷键----常更新

    1. Ctrl+向上键----文本向上滚动  Ctrl+向下键----文本向下滚动  Ctrl+Enter-----向下增加一行  Ctrl+Shift+Enter-------向上增加一行 2. 避 ...

  3. JAVA:创建类和对象

    package duixiang; public class duixiang { /* * 类的实例化:创建对象 */ public static void main(String[] args) ...

  4. Linux终端连接Linux服务器

    我们经常需要通过类UNIX下连接我们的Linux服务器.比如我的Mac下经常需要连接上Linux服务器.一般系统都提供了ssh支持,可以直接连接: 通过命令: ssh root@120.25.12.9 ...

  5. 如何在vue里面访问php?

    如果你选择前端使用vue框架,后端用PHP开发,服务器就不用node了,用Apache就好了 开发中,看你是否想进行前后端的分离.如果你不想进行前后端的分离,可以将vue的项目build之后放到php ...

  6. ADO.NET复习总结(2)--连接池

    1. 2. 3.示例:在一百次循环中,执行数据库连接的打开和关闭,使用stopwatch查看所用的时间. using System; using System.Collections.Generic; ...

  7. 【开发技术】Beyond Compare

    黑色表示左右两侧的文件(夹)是一样的; 紫色表示右(左)侧是完全没有的,这时我们右击这个文件(夹),选择“复制到右(左)侧”即可: 红色表示两边都有这个文件(夹),但不完全相同,这时你就要权衡一下修改 ...

  8. PostgreSql问题:ERROR: operator does not exist: timestamp without time zone > character varying

    问题描述: ERROR:  operator does not exist: timestamp without time zone > character varying 解决方法: //注意 ...

  9. python文件操作总结

    python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目 ...

  10. jquery checkbox 全选反选代码只能执行一遍,第二次就失败

    遇到问题背景: 在写到购物车的全选交互的时候,商品选中的状态只有在第一次的时候可以,第二次就无法选中:(代码如下) $(".chooseall").click(function() ...