分享经验知识:UITableViewCell复用问题
2014-01-21 10:46
225 查看
很多朋友觉得UITableViewCell复用问题很难处理,百思不得其解,甚至有很多朋友自己琢磨很久也不明白个究竟。现在分享一下个人的一些经验,希望对大家有帮助,如果有好的意见或者有不同的看法也可以提出来,让我们一起分享一起进步,知识只有在分享的情况下才能实现它的最大价值。好了,废话少说,直奔主题了。列举两个场景对比一下,也许tableviewcell的复用就很清晰明了了。本文来自于无限互联的学员。
例1:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"cell1";
UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
UILabel *labelTest = [[UILabel alloc]init];
[labelTest setFrame:CGRectMake(2, 2, 80, 40)];
[labelTest setBackgroundColor:[UIColor clearColor]];
[labelTest setTag:1];
[[cell contentView]addSubview:labelTest];
}
UILabel *label1 = (UILabel*)[cell viewWithTag:1];
[label1 setText:[self.tests objectAtIndex:indexPath.row]];
return cell;
}
例2:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{
static NSString *CellIdentifier = @"cell1";
UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
UILabel *labelTest = [[UILabel alloc]init];
[labelTest setFrame:CGRectMake(2, 2, 80, 40)];
[labelTest setBackgroundColor:[UIColor clearColor]]; //之所以这里背景设为透明,就是为了后面让大家看到cell上叠加的label。
[labelTest setTag:1];
[[cell contentView]addSubview:labelTest];
[labelTest setText:[self.tests objectAtIndex:indexPath.row]];
return cell;
}
当你上下来回滑动tableview的时候就会看到区别,第一种程序界面不会出现异常,但是第二种就不是了,会出现字体叠加现象,其实更确切的是多个label的叠加。为什么呢,因为在tableview刷新的时候,如果那个位置已经有现成的cell,它就不会再重新请求资源生成新的cell了,而是复用原来的cell。所以对于对于第一种,代码的思路是第一次在cell不存在的时候生成cell,定义cell样式,以后不管是刷新还是重新请求还好,它都只是复用已生成的cell。而第二种思路是,在cell不存在的时候,请求生成cell,然后给cell上添加label,刷新的时候,会复用已有的cell,但是会重复添加label,故造成重叠的现象。
之前类似的问题来回困扰了我好多次,我都没有下决心彻底搞清楚,每次都是得过且过,只要程序最好调好了,就OK。今天又碰到了类似的问题,终于大致搞清楚了,希望以后不会再被它坑害。
上面分享的是个人的心得,希望大家有好的知识,有干货也分享出来,让我们一起学习,一起进步。当然,希望我分享的这些小知识能够帮助到大家,帮助到大家是我最大的满足。作者信息:师从无限互联陈为老师
例1:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"cell1";
UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
UILabel *labelTest = [[UILabel alloc]init];
[labelTest setFrame:CGRectMake(2, 2, 80, 40)];
[labelTest setBackgroundColor:[UIColor clearColor]];
[labelTest setTag:1];
[[cell contentView]addSubview:labelTest];
}
UILabel *label1 = (UILabel*)[cell viewWithTag:1];
[label1 setText:[self.tests objectAtIndex:indexPath.row]];
return cell;
}
例2:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{
static NSString *CellIdentifier = @"cell1";
UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
UILabel *labelTest = [[UILabel alloc]init];
[labelTest setFrame:CGRectMake(2, 2, 80, 40)];
[labelTest setBackgroundColor:[UIColor clearColor]]; //之所以这里背景设为透明,就是为了后面让大家看到cell上叠加的label。
[labelTest setTag:1];
[[cell contentView]addSubview:labelTest];
[labelTest setText:[self.tests objectAtIndex:indexPath.row]];
return cell;
}
当你上下来回滑动tableview的时候就会看到区别,第一种程序界面不会出现异常,但是第二种就不是了,会出现字体叠加现象,其实更确切的是多个label的叠加。为什么呢,因为在tableview刷新的时候,如果那个位置已经有现成的cell,它就不会再重新请求资源生成新的cell了,而是复用原来的cell。所以对于对于第一种,代码的思路是第一次在cell不存在的时候生成cell,定义cell样式,以后不管是刷新还是重新请求还好,它都只是复用已生成的cell。而第二种思路是,在cell不存在的时候,请求生成cell,然后给cell上添加label,刷新的时候,会复用已有的cell,但是会重复添加label,故造成重叠的现象。
之前类似的问题来回困扰了我好多次,我都没有下决心彻底搞清楚,每次都是得过且过,只要程序最好调好了,就OK。今天又碰到了类似的问题,终于大致搞清楚了,希望以后不会再被它坑害。
上面分享的是个人的心得,希望大家有好的知识,有干货也分享出来,让我们一起学习,一起进步。当然,希望我分享的这些小知识能够帮助到大家,帮助到大家是我最大的满足。作者信息:师从无限互联陈为老师
相关文章推荐
- iOS开发经验分享:UITableViewCell复用问题
- WCDMA联通wo3G186卡上网限速,异地漫游上网慢问题解决,分享经验
- 经验分享 | 10 个最基本的JS面试问题及答案
- x64系统安装ODAC问题经验分享
- 十八年开发经验分享(二)问题解决篇(上)
- 分享一点在用Qt编写计算器的过程中所遇到的问题(主要是信号和槽的问题)大神们就没必要看了,都是一些小白摸爬打滚的经验
- 经验分享之搭建SVN服务器问题集锦
- 问题,经验,知识,时间,梦想
- 十八年开发经验分享(二)问题解决篇(上)
- 【经验分享】IMX6开发板编译问题及解决方法
- 如何备考CCIE/HCIE,一个源自于美帝学员的问题,我会在下午的直播分享会上为大家分享一下经验
- 面试经验分享之机器学习、大数据问题
- QT SDK 4.8.4 fedora中安装与编译遇到的小问题与解决,经验分享
- SoC知识及选型经验分享
- 平时看到C/C++ 结构体问题的一些知识,比较有用,分享出来
- 每一个程序员都应该知道的高并发处理技巧、创业公司如何解决高并发问题、互联网高并发问题解决思路、caoz大神多年经验总结分享
- weblogic10.3单点登录问题处理经验分享
- 十八年开发经验分享(三)问题解决篇(中)
- U盘插上,系统有反应,但是却不识别,电脑能识别其他的U盘,U盘在其他电脑也是好用的经验分享(驱动问题)
- mfc中Ribbonbar按钮使用的中的一些问题经验分享