文档章节

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_回眸
2018/01/19
0
0
优雅的开发TableView

前言 UITableView(UITableViewController)是iOS开发使用频率最高的一个组件。 不管是使用UITableView还是还是UITableViewController,在开发的时候,我们都需要实现两个协议: 这两个协议的...

黄文臣
2017/06/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

都996了,研发效能还是提不起来,关键在这里

研发效能的提升必须落实为团队需求、协作和工程技术等实践。接下来的几篇文章,我将结合不同BU的案例,介绍研发效能提升的具体实践。 本篇将从团队协作的实践开始,通过可视化端到端的价值流...

阿里云官方博客
31分钟前
3
0
CentOS开机自启SVN

安装好 svn 服务后,默认是没有随系统启动自动启动的, CentOS 7 的 /etc/rc.d/rc.local 是没有执行权限的, 系统建议创建 systemd service 启动服务 于是查看 systemd 里 svn 的配置文件 /l...

临江仙卜算子
33分钟前
1
0
redo和undo区别讨论

英文解释: 名词:两种流程,redo重做流程,undo撤销还原流程;或则是redo日志与undo段的简称 动词:redo即重做,undo即撤销还原。 翻译有时候为了简单,常把动词和名称混用。不同场景不同的...

突突突酱
45分钟前
1
0
shell实例100例《二》

11、题目要求 写一个脚本实现如下功能: 输入一个数字,然后运行对应的一个命令。 显示命令如下: cmd meau* 1 - date 2 - ls 3 - who 4 - pwd 当输入1时,会运行date, 输入2时运行ls, 以此类...

寰宇01
46分钟前
1
0
Angular在页面加载很慢的时候,会出现双花括号的问题

我们知道在应用的页面或者组件需要加载数据时,浏览器和angular渲染页面都需要消耗一定的时间。这里的间隔可能很小,甚至让人感觉不到区别;但也可能很长,这样会导致让我们的用户看到了没有...

孟飞阳
47分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部