关于UITableViewCell的循环利用--面向初学者
UITableViewCell的重复利用机制有效地节省内存开销和提高程序性能。
1 原理
tableView拥有一个缓存池,存放未在使用(没有显示在界面)的cell。
tableView有一行cell要显示时先从缓存池里找,没有则创建,有一行cell隐藏不需要显示时就放到缓存池。
2 图解循环利用代码
//cellForRow 代码
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *ID = @"test"; // cell循环利用标识为”test”
//从当前tableView对应的缓存池里找标识为”test”的cell;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
//如果缓存池里没有,即cell为空,创建新的cell
if(!cell){
cell = [[UITableViewCell alloc]init];
}
return cell;
}


3 循环利用问题
3.1 问题1
这里引入一个数据模型 LSUser(用户模型),
属性: name(NSString, 名字), vip(BOOL, 是否会员)

图3-1
//cellForRow方法中设置数据
//设置用户名称
cell.textLabel.text = user.name;
//如果用户是vip,设置用户名称颜色为红色
if(user.vip){
cell.textLabel.textColor = [UIColor redColor];
}
由于吴八不是会员,跳过if 语句,吴八名称颜色应为黑色,但实际上却保留着陈七cell0设置的会员颜色红色。这是循环利用一个简单的问题所在。
假设if 语句中添加了对称的设置语句,这个问题就不会出现。
if(user.vip){
cell.textLabel.textColor = [UIColor redColor];
}else{
cell.textLabel.textColor = [UIColor blackColor];
}
UITableViewCell的循环利用要求我们对称地设置视图的外观和状态。
实际上这个事例的循环利用问题可以认为出在cell.textLabel.textColor默认颜色为黑色上,假设需求是非会员名称颜色为蓝色,于是设置数据时:
cell.textLabel.textColor = user.vip ? [UIColor redColor]: [UIColor blueColor];
认真思考下。。。
3.2 问题2
这里有个需求:点击了某一行cell, 当前cell用户名称颜色改为紫色, 其余为原来的黑色
可能你会这么做:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.textLabel.textColor = [UIColor purpleColor];
}
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.textLabel.textColor = [UIColor blackColor];
}
暂时看来确实符合了需求,点击的当前行名称颜色为紫色,其余为黑色
但是,当你拖动tableView, 当前行隐藏,随意拖动,愕然地发现某一行名称颜色为紫色,再回到原先点击的当前行,名称颜色却为黑色而不是紫色。
这也是循环利用的问题。接下来解决这个问题。
当一行cell将要显示时,会调用tableView的数据源方法-tableView:cellForRowAtIndexPath;
循环利用影响影响cell显示,不会影响原始数据,该方法中进行了数据设置的步骤,利用它介绍两种解决方案:
1) 循环利用不会影响indexPath,indexPaht是唯一的。
首先拥有一个NSIndexPath类型的selectedIndexPath属性,用于纪录当前选中行,在didSelectRowAtIndexPath方法中进行赋值。
然后在-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法中,
//设置数据
//取出对应行的数据模型
LSUser *user = self.users[indexpath.row];
//设置用户名称
cell.textLabel.text = user.name;
//根据是否是选中行设置名称颜色
if(self.selectedIndexPath == indexPath){
cell.textLabel.textColor = [UIColor purpleColor];
}else{
cell.textLabel.textColor
= [UIColor blackColor];
}
2) 对数据动手,从数据模型中派生一个专对于该cell的数据模型,追加相应的属性,然后在相应的地方对数据进行处理和设置。这里不再赘述,该方案适合处理复杂的情况,比如如不一定是选中与非选择两种状态,还可能是三种以上状态,或者cell的动画效果,或者需要[tableView reloadData]等的情况。
关于UITableViewCell的循环利用--面向初学者的更多相关文章
- 实现UITableView循环利用
tableViewUITableView循环利用 前言 大家都知道UITableView,最经典在于循环利用,这里我自己模仿UITableView循环利用,写了一套自己的TableView实现方案,希 ...
- 解决cell循环利用造成的重复勾选
@interface ProfessionViewController (){ NSMutableArray *_professionArray;//cell模型数组 NSMutableArray * ...
- iOS开发:一个瀑布流的设计与实现(已实现缓存池功能,该功能使得瀑布流cell可以循环利用)
一个瀑布流的实现有三种方式: 继承自UIScrollView,仿写UITableView的dataSource和delegate,创造一个缓存池用来实现循环利用cell 写多个UITableview( ...
- iOS边练边学--UITableView性能优化之三种方式循环利用
一.cell的循环利用方式1: /** * 什么时候调用:每当有一个cell进入视野范围内就会调用 */ - (UITableViewCell *)tableView:(UITableView *)t ...
- iOS开发小技巧--TableView中headerView的循环利用,以及自定义的headerView
一.首先要搞清楚,tableView中有两种headerView,一个是tableHeaderView,另一个是headerView.前者就一个;后者根据session决定个数 headerView的 ...
- iOS开发UI篇—无限轮播(循环利用)
iOS开发UI篇—无限轮播(循环利用) 一.无限轮播 1.简单说明 在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动. 在开发的时候,我们通常的做法是使用一个UIScrollV ...
- [UGUI]滑动列表优化(循环利用)
需要注意的有下面几点: 1. 区分好表现上的index和逻辑上的index.表现上的index是指这个go是go列表中的第几项,但实际上这个index的意义并不大,因为在滚动的过程中go列表是轮转的: ...
- [译]面向初学者的Asp.Net状态管理技术
介绍 本文主要讲解Asp.Net应用程序中的状态管理技术(Asp.Net中有多种状态管理技术),并批判性地分析所有状态管理技术的优缺点. 背景 HTTP是无状态的协议.客户端发起一个请求,服务器响应完 ...
- 关于Java 实现抽象类的抽象方法的特性的利用---面向切面
今天看工作看代码突然有了以下设想: /** * Created by zq on 2017/5/25. * 抽象类 */ public abstract class AbstractC { publi ...
随机推荐
- CSS构造模型
div 边距 边框 定位 浮动 21.1 div 部分(division)---<div>元素,经常以div形式引用---是XHTML元素,用于定义XHTML文件中的区域. 1.添加div ...
- 射击的乐趣:WIN32诠释打飞机游戏源码补充
打飞机游戏源码补充 从指定位置加载bmp并显示到对话框. , TRUE);, , LR_LOADFROMFILE); { BITMAP bmpinfo; ...
- iOS动画详解(一)
Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎.它提供了低级别.轻量级.高保真度的2D渲染.该框架可以用于基于路径的绘图.变换.颜色管理.脱屏渲 ...
- lua string 库
--lua中字符串索引从前往后是1,2,……,从后往前是-1,-2……. --string库中所有的function都不会直接操作字符串,只返回一个结果. ---------------------- ...
- Android大图片裁剪终极解决方案 原理分析
约几个月前,我正为公司的APP在Android手机上实现拍照截图而烦恼不已. 上网搜索,确实有不少的例子,大多都是抄来抄去,而且水平多半处于demo的样子,可以用来讲解知识点,但是一碰到实际项目,就漏 ...
- UITextView光标在中间的问题
if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) { self.automatica ...
- POJ 2003 Hire and Fire (Tree)
题目:Hire and Fire 题目翻译成数据结构就是:建树,加结点,删除结点,打印结点.只有删除结点稍微复杂点,因为删除设计掉树的调整. 首先要考虑树怎么存储才能使解题更顺手. 1.我们要存储每个 ...
- 本地win8系统部署网站遇到的问题
网站开发环境:vs2013 .操作系统是win8.1系统. iis8 win8系统激活码:00261-30000-00000-AA825 需要部署的网站文件夹放在了桌面上,在iis里配置时,无法启 ...
- C#-datagridview右键选中行
在datagridview中有时需要在右键点击某行的时候就选中它,那么我们只需要在datagridview的CellMonseDown事件中添加如下代码就行: && e.ColumnI ...
- Codeforces Round #322 (Div. 2) B. Luxurious Houses 水题
B. Luxurious Houses Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/581/pr ...