文档章节

cell类复用问题分析

Dolion-Hou
 Dolion-Hou
发布于 2017/07/11 10:37
字数 733
阅读 6
收藏 0
  • 一、分析:
  •     复用问题导致的现象:
  • 1、cell中数据赋值不成功。
  • 2、cell中数据赋值错乱。
  • 3、cell内赋值叠加。(本质即是cell内创建的控件叠加。多次创建造成的现象)。---最常见现象

二、这里分两种情况

1、系统的cell.

2、自定义cell.

三、情况分析

  • 首先我们分析系统的cell
  • 注意:系统的cell在实例化UITableView的时候,随即去注册一个cell:
  • [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];

  • 这样写的话,如果你用这种代理方式去展示cell内容时

这时if(!cell){  }这个方法将不会被执行。对,你猜对了。这时cell是存在的。[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];这句话已经注册了一个cell.所以它会在tableView的缓存池中去取。

此时你就不能在cell中添加一个label了。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
        UILabel *titleLabel = [[UILabel alloc] init];
        [titleLabel sizeToFit];
        titleLabel.tag = 100;
        titleLabel.frame = CGRectMake(170, 0, 50, 44);
        [cell.contentView addSubview:titleLabel];
    }
    cell.textLabel.text = [NSString stringWithFormat:@"%ld",indexPath.row];
    return cell;
}

这就是这个结果      cell中数据赋值不成功。

@另一点你没有注册cell。要记得label的创建一定要放在if(!cell){   }这个作用域中。如果这时你放在作用域之外的话,每一次走代理方法的时候,都会创建一个label。这样label因为cell的复用,你在来回滚动的时候,label会越来越多的叠加。除非你写上这段代码:

for (id obj in cell.contentView.subviews) {
        if ([obj isKindOfClass:[UILabel class]]) {
            UILabel *lab = (UILabel *)obj;
            if (lab.tag == 100) {
                lab.text = [NSString stringWithFormat:@"%ld",indexPath.row];
            }
        }
    }
这段代码定要放在你创建label代码之前,且不要放在if(!cell){   }这个作用域中。(放在label创建之后,你将会把你刚创建的label也移除,这样你的cell中就不会有任何的label控件了。如果放在if(!cell){   }这个作用域中,那么他只只有在cell不存在的时候才会去执行。也不能达到你想要的效果)

@如果你这样去写

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

你就不要去写这些且必需注册cell

if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
        UILabel *titleLabel = [[UILabel alloc] init];
        [titleLabel sizeToFit];
        titleLabel.tag = 100;
        titleLabel.frame = CGRectMake(170, 0, 50, 44);
        [cell.contentView addSubview:titleLabel];
    }
这时,这段代码将不会被执行。

 

  • 然后我们分析自定义的cell
  • 用法和系统cell基本一样,但要注意下面一点

如果你自定义cell你的控件的创建尽量要放你cell的单独管理类中去创建,不要放在代理方法中会创建。这样就不会存在复用类的问题了。如果你硬要写代理 的方法中,你就要在你创建控件之前同样把你之前创建的控件先移除。避免造成复用。

 

 

 

© 著作权归作者所有

共有 人打赏支持
Dolion-Hou

Dolion-Hou

粉丝 20
博文 28
码字总数 33494
作品 1
cell的复用问题

tableView是大家非常熟悉的一个控件,在绝大多数的界面上都有其身影,但就是这么普遍使用的控件,对于刚入行不深的小白也是有一些坑需要堤防,下面谨就我在开发过程中遇到的cell复用问题做一...

hungryBoy
2016/01/04
531
1
iOS开发捷径学习(二)

上一章内容讲解了xib文件编译后成nib,而反过来nib文件如何加载完成页面的渲染的呢?我们来梳理一下整个过程。 nib的加载过程分析 1.将nib文件加载入内存 一种法法:通过bundle加载 还有一种...

智小融
2017/12/18
0
0
iOS流布局UICollectionView系列一——初识与简单使用UICollectionView

iOS流布局UICollectionView系列一——初识与简单使用UICollectionView 一、简介 UICollectionView是iOS6之后引入的一个新的UI控件,它和UITableView有着诸多的相似之处,其中许多代理方法都十...

珲少
2015/10/27
0
5
优雅的实现TableViewCell单选

最近有些忙,好久没有写博客了。 分享一个cell做单选的思路 可行的思路 在tableview的控制器中设立一个变量记录选择的indexPath,点击cell之后刷新表格来和现有indexPath对比 和第一种大同小...

Pnyg_回眸
01/19
0
0
使用 Three20 的经验分享

记:Three20(简称:TT)是Facebook维护的一个开 源iPhone应用框架。框架封装了一系列视觉控件,网络组件,和工具方法。最近使用TT重构了一个app,这个app在1万行规模使用的是原生代码,架 ...

乌邦托
2011/08/03
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

权限框架Shiro学习之表结构设计

权限框架Shiro学习之表结构设计 Shiro是一款优秀的开源安全框架,学习Shiro大家可以参考张开涛老师的博客:跟我学Shiro,当然也可参考我之前的笔记:Shiro实现身份认证、Shiro实现授权。 在学...

TyCoding
9分钟前
0
0
find命令和文件名后缀

9月18日任务 2.23/2.24/2.25 find命令 2.26 文件名后缀 which which 搜索可执行文件,必须在PATH环境变量目录中!!否则无法搜到! [root@centos7 ~]# which lsalias ls='ls --color=auto'...

robertt15
12分钟前
0
0
阿里Java程序员必备的Intellij IDEA 插件

善用Intellij插件可大幅提升我们的效率,以下是我用过不错的Intellij插件,分享给大家希望能帮到大家。 1. .ignore 生成各种ignore文件,一键创建git ignore文件的模板,免得自己去写 2. lom...

我是你大哥
22分钟前
0
0
为什么Java大神,都在看Spring Boot和Spring Cloud的书?

如果你是一名Java开发人员,并且最近正打算学习Spring Boot和Spring Cloud框架并寻找一些关于它们的最好的书籍,那么,你今天就来对地方了。 本文,我们将讨论一些学习Spring Boot和Spring ...

Java小铺
40分钟前
10
0
springboot logback日志配置

springboot 如果不使用外部tomcat的话,日志是需要自己配置的,不然的话就只有控制台的日志,但是日志又是我们在项目上了生产环境,出问题时,检查问题的唯一途径,所以我们要配置详细的日志...

曾大大胖
40分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部