文档章节

关于iOS`UITableViewCell 使用系统 多选 全选问题

壹峰
 壹峰
发布于 2017/07/13 11:41
字数 1203
阅读 8
收藏 0

 最近做一个项目,要用到UITableView中cell的多选和全选。 

上网简单一搜索,发现很多小伙伴对于这块是自己自定义cell且通过代码判断,再去改变UI来实现。很多方法的理论基础基本上都是自己给cell写一个属性来记录其是否未被选中的状态,然后单独用一个字典来装这些状态和对应cell所在的indexPath  每次加载cell再去做判断 如何显示选中与非选中状态UI不同。 就突然记起Apple对这块功能貌似是已经实现了的,并且留了简单易懂的接口给我们。

于是首先建立一个简单的TableView如下图:

  接下来简单为tableView添加俩行代码就可以实现选中后那个蓝色的勾。

table.editing = YES;  
table.allowsMultipleSelectionDuringEditing = YES;  

代码中第一行意思为table进入编辑状态,第二行是允许table在编辑的时候多选。当然关于table的编辑在<UITableViewDelegate>中有关于table编辑的插入 删除等等不在此赘述。 然后接下来是实现cell的全选的实现。此处我是将点击全选和取消全选都写在左边的NavigationItem上:

- (void)viewDidLoad {  
    [super viewDidLoad];  
    // Do any additional setup after loading the view, typically from a nib.  
      
    self.title = @"多选cellDemo";  
      
    [self customTableView];  

    //为左边的item设置标题和动作  
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"全选" style:UIBarButtonItemStylePlain target:self action:@selector(selecteAllCells:)];  
      
}  
  
  
#pragma mark Actions  
- (void)selecteAllCells:(UIBarButtonItem *)sender {  
    if (_isAllSelected == NO) {  
          
        _isAllSelected = YES;  
        [sender setTitle:@"取消"];  
          
        for (int i = 0; i < self.dataArray.count; i++) {  
  
            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];  
            [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop];  
        }  
    } else {  
          
        _isAllSelected = NO;  
        [sender setTitle:@"全选"];  
          
        for (int i = 0; i < self.dataArray.count; i++) {  
              
            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];  
            [self.tableView deselectRowAtIndexPath:indexPath animated:YES];  
        }  
    }  
      
}  

 

 


代码实现逻辑主要是讲所有cell的indexPath找出来用table的方法选择和取消选择cell.效果图如下:

 

选中之后调用[tableView indexPathsForSelectedRows]获得所有indexPath.

此时有新的需求 选中之后背景的灰色不太好看 客户只想要保留蓝色的勾,不要这个背景灰色。那么可在<UITableViewDataSource>的返回和自定义cell的函数中设置 

   cell.selectedBackgroundView = [[UIView alloc] init]; 另外一个小tip 可设置tableView的tableFooterView = [[UIView alloc] init]可以消除tableView下面那些多出来的线条。效果图如下:

 

此时客户需求又有变化,客户觉得那个选中图片圆圈的背景图片蓝色太深 不好看,让改淡些。心里一万匹草泥马呼啸而过 但咱作为有素质有技术的工程师不能表现出来对吧。于是又接着改。直到此时 仍不愿去自定义cell里面的控件写逻辑 忒麻烦了有木有。

于是想,该图片在界面上已经显示出来了,那肯定是存在的于是在调用 [cell subviews]方法寻找,发现在<UITableViewDataSource>的自定义cell那个方法里没什么线索。

 

换个地方,于是在<UITableViewDelegate>里面选择回调的地方用类似的方法找,果然皇天不负有心人。

由下图可见,此时选中的cell中有四个子视图 类名分别为:UIView,UITableViewCellContentView,UITableViewSeparatorView,UITableViewCellEditControl.猜也能猜到我们的蓝色勾勾在第四个里面,正好里面还有一个imageView属性。然后问题又来了,这个UITableViewCellEditControl是何方神圣?翻遍了dash里面iOS9.0文档和UITableViewCell头文件并没有找到这么一个类。想来可能是一个匿名类,不过还好其基类是UIControl类,于是可以用面向对象三大特性之一的多态,循环判断找出该对象。没有头文件的类,属性自然也没有setter和getter方法,不能通过点语法读取到。于是我们还有一个强大的工具,叫做KVC(key-value-coding)键值编码,对OC这门动态语言量身定制,利用runtime运行时原理动态为对象设置属性。于是通过以下代码设置

#pragma mark <UITableViewDelegate>  
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {  
      
    NSArray *subviews = [[tableView cellForRowAtIndexPath:indexPath] subviews];  
      
    for (id obj in subviews) {  
        if ([obj isKindOfClass:[UIControl class]]) {  
  
            for (id subview in [obj subviews]) {  
                if ([subview isKindOfClass:[UIImageView class]]) {  
                      
                    [subview setValue:blueBackground forKey:@"tintColor"];  
                    break;  
                }  
                  
            }  
        }  
    }  
}  


至此,终于达到目的,且重要的是没用多少代码有木有。效果图如下

 

 

最后,还有一个小小Bug,因为我们的全选的做法是循环所有cell的indexPath 然后掉方法

[self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop];这样,全选的cell颜色又回到了原来那么深 于是将改变cell选中图片背景色的代码封装成方法 在这俩处调用整理代码如图

 

本篇博客Demo地址https://github.com/xmy0010/DemoForCSDN

本人邮箱18144200589@163.com欢迎小伙伴一起讨论,学习,进步。

本文转载自:

共有 人打赏支持
壹峰
粉丝 8
博文 582
码字总数 9582
作品 0
广州
其他
私信 提问
iOS开发小技巧:刷新UITableView

在很多APP界面都用到的UITableView,对iOS开发者来说一定不陌生吧。网上关于UITableView的文章早已多不胜数,尤其是关于UITableView优化方面的,对开发者来说非常值得一看。 现在就来看看,刷...

flyurt
2015/10/23
1K
0
iOS开发tips-神奇的UITableView

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jianxin160/article/details/71436920 概述 UITableView是iOS开发中使用频率最高的UI控件,在前面的文章中对于...

KenshinCui
2017/05/08
0
0
iOS开发tips-UITableView、UICollectionView行高/尺寸自适应

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jianxin160/article/details/55002487 UITableView 我们都知道UITableView从iOS 8开始实现行高的自适应相对比...

KenshinCui
2017/02/12
0
0
IOS学习,最简单的表格应用程序,学习,列出博客

IOS编程浅蓝教程,这是博客地址http://www.cnblogs.com/haichao/category/425378.html IOS编程浅蓝教程:锲子 IOS编程浅蓝教程(一)先决条件:开始iOS编程的必要准备 IOS编程浅蓝教程(二) Hel...

andy521zhu
2015/01/17
0
0
iOS开发系列--UITableView全面解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jianxin160/article/details/47753205 --UIKit之UITableView 概述 在iOS开发中UITableView可以说是使用最广泛...

KenshinCui
2015/08/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7重置密码、单用户模式、救援模式、ls命令、chmod命令

在工作当中如果我们错误的配置了文件使服务器不能正常启动或者忘记密码不能登录系统,如何解决这些问题呢?重装系统是可以实现的,但是往往不能轻易重装系统的,下面用忘记密码作为例子讲解如...

李超小牛子
今天
3
0
Python如何开发桌面应用程序?Python基础教程,第十三讲,图形界面

当使用桌面应用程序的时候,有没有那么一瞬间,想学习一下桌面应用程序开发?行业内专业的桌面应用程序开发一般是C++,C#来做,Java开发的也有,但是比较少。本节课会介绍Python的GUI(图形用...

程序员补给栈
今天
6
0
kafka在的使用

一、基本概念 介绍 Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统...

狼王黄师傅
今天
3
0
Android JNI总结

0x01 JNI介绍 JNI是Java Native Interface的缩写,JNI不是Android专有的东西,它是从Java继承而来,但是在Android中,JNI的作用和重要性大大增强。 JNI在Android中起着连接Java和C/C++层的作...

天王盖地虎626
昨天
3
0
大数据教程(11.8)Hive1.2.2简介&初体验

上一篇文章分析了Hive1.2.2的安装,本节博主将分享Hive的体验&Hive服务端和客户端的使用方法。 一、Hive与hadoop直接的关系 Hive利用HDFS存储数据,利用MapReduce查询数据。 二、Hive与传统数...

em_aaron
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部