文档章节

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
将UITableView封装到极致

介绍 “极致”这种情怀问题,手上做不到没关系,嘴上是肯定要做到的。只要不是能力太打脸,坚持一下下倒是也模棱两可。 本文参考了更轻量的 View Controllers ,对table用到的两个个协议,进...

Daniel_s
2016/01/03
24
0
优雅的开发TableView

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

黄文臣
2017/06/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

epoll中使用

1、一个线程epoll_wait时,另一个线程调用epoll_ctl是安全的。 2、使用edge触发,在socket有数据到来后,不收取数据,再次调用epoll_ctl将socket加入,仍会触发下一次动作。 asio用该方法来发...

gelare
13分钟前
1
0
PHP规范PSR2

PSR标准 - PSR-2 为了尽可能的提升阅读其他人代码时的效率,下面例举了一系列的通用规则,特别是有关于PHP代码风格的。 各个成员项目间的共性组成了这组代码规范。当开发者们在多个项目中合作...

geek土拨鼠
28分钟前
5
0
【极简】如何在服务器上安装SSL证书?

本文适合任何人了解,图形化操作。下面以腾讯云为例,并且服务器(linux)也安装了宝塔面板。 1.登陆腾讯云账号进入控制台,找到SSL的产品 2.按要求申请并填写表单,记住私钥密码 3.提交后,待...

皇冠小丑
37分钟前
1
0
深入理解编译器

深入理解编译器 原文出处 欢迎向Rust中文社区投稿,投稿地址,好文将在以下地方直接展示 1 Rust中文社区首页 2 Rust中文社区Rust文章栏目 3 知乎专栏Rust语言 编程语言是如何工作的 从内部理解...

krircc
39分钟前
1
0
Centos7&docker-ce&compose&wordpress

如题,最近帮人装个WordPress,想起来用docker方便,这里做个记录。 因为docker要求linux内核版本3.10以上我记得,所以直接用的centos7省去很多麻烦。 主机在国内的先把yum源改成国内的阿里云...

虚拟世界的懒猫
43分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部