文档章节

cell类复用问题分析

Dolion-Hou
 Dolion-Hou
发布于 2017/07/11 10:37
字数 733
阅读 6
收藏 0
点赞 0
评论 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
将UITableView封装到极致

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

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

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

黄文臣
2017/06/19
0
0
关于UITableView的Cell复用谈谈一些心得

查看博客:Rainbird的个人博客 UITableView是ios开发中使用率极高的一个控件,就我个人来说,几乎我做的每一个View上都有她的身影。但是很长一段时间,我对她的理解都很肤浅。对我来说触动较...

meilidashijie
2013/01/02
0
2
TableViewCell 复用问题 设置 frame 的正确姿势

UITableViewCell 是 UITableView 的一个小单元,使用非常频繁,原来我在 [iOS学习之UITableView(一): 新手篇创建tableView][1] 中也讲解过 UITableViewCell 的使用,但是还有一些东西没有讲到...

芳仔小脚丫
2016/12/26
115
0
iOS开发 - UITableview代理方法与Viewcontroller分离

序 ---在objcio.cn中有一篇文章更轻量的 View Controllers.其中有一小节,是说把UITableview的datasource和delegate分离出Viewcontroller的。我也试着实现了一下,随便把思路总结下~ DEMO --...

resory
2015/12/31
647
10

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NNS域名系统之域名竞拍

0x00 前言 其实在官方文档中已经对域名竞拍的过程有详细的描述,感兴趣的可以移步http://doc.neons.name/zh_CN/latest/nns_protocol.html#id30 此处查阅。 我这里主要对轻钱包开发中会用到的...

暖冰
今天
0
0
32.filter表案例 nat表应用 (iptables)

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 10.15 iptables filter表案例: ~1. 写一个具体的iptables小案例,需求是把80端口、22端口、21 端口放行。但是,22端口我...

王鑫linux
今天
0
0
shell中的函数&shell中的数组&告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

影夜Linux
今天
0
0
Linux网络基础、Linux防火墙

Linux网络基础 ip addr 命令 :查看网口信息 ifconfig命令:查看网口信息,要比ip addr更明了一些 centos 7默认没安装ifconfig命令,可以使用yum install -y net-tools命令来安装。 ifconfig...

李超小牛子
今天
1
0
[机器学习]回归--Decision Tree Regression

CART决策树又称分类回归树,当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很...

wangxuwei
昨天
1
0
Redis做分布式无锁CAS的问题

因为Redis本身是单线程的,具备原子性,所以可以用来做分布式无锁的操作,但会有一点小问题。 public interface OrderService { public String getOrderNo();} public class OrderRe...

算法之名
昨天
10
0
143. Reorder List - LeetCode

Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前后两部分,将后部...

yysue
昨天
1
0
数据结构与算法1

第一个代码,描述一个被称为BankAccount的类,该类模拟了银行中的账户操作。程序建立了一个开户金额,显示金额,存款,取款并显示余额。 主要的知识点联系为类的含义,构造函数,公有和私有。...

沉迷于编程的小菜菜
昨天
1
0
从为什么别的队伍总比你的快说起

在机场候检排队的时候,大多数情况下,别的队伍都要比自己所在的队伍快,并常常懊悔当初怎么没去那个队。 其实,最快的队伍只能有一个,而排队之前并不知道那个队快。所以,如果有六个队伍你...

我是菜鸟我骄傲
昨天
1
0
分布式事务常见的解决方案

随着互联网的发展,越来越多的多服务相互之间的调用,这时候就产生了一个问题,在单项目情况下很容易实现的事务控制(通过数据库的acid控制),变得不那么容易。 这时候就产生了多种方案: ...

小海bug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部