tableView中cell的重用机制

这里就涉及了TableView的重用机制,为了做到显示和数据分离,iOS tableView的实现并且不是为每个数据项创建一个tableCell。而是只创建屏幕可显示最大个数的cell,然后重复使用这些cell,对cell做单独的显示配置,来达到既不影响显示效果,又能充分节约内容的目的。下面简要分析一下它的实现原理。

  

重用实现分析

  查看UITableView头文件,会找到visibleCells,和自己设想的一个reusableCells两个结构。visiableCells内保存当前显示的cells,reusableCells保存可重用的cells。

  TableView显示之初,reusableCells为空,那么tableView dequeueReusableCellWithIdentifier:CellIdentifier返回nil。开始的cell都是通过[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]来创建,而且cellForRowAtIndexPath只是调用最大显示cell数的次数。

  比如:有50条数据,iPhone一屏最多显示10个cell。程序最开始显示TableView的情况是:

  1. 用[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]创建10次cell,并给cell指定同样的重用标识(当然,可以为不同显示类型的cell指定不同的标识)。并且10个cell全部都加入到visiableCells数组,reusableCells为空。

  2. 向下拖动tableView,当cell1完全移出屏幕,并且cell11(它也是alloc出来的,原因同上)完全显示出来的时候。cell11加入到visiableCells,cell1移出visiableCells,cell1加入到reusableCells。

  3. 接着向下拖动tableView,因为reusableCells中已经有值,所以,当需要显示新的cell,cellForRowAtIndexPath再次被调用的时候,tableView dequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。cell1加入到visiableCells,cell1移出reusableCells;cell2移出visiableCells,cell2加入到reusableCells。之后再需要显示的Cell就可以正常重用了。

  所以整个过程并不难理解,但需要注意正是因为这样的原因:配置Cell的时候一定要注意,对取出的重用的cell做重新赋值,不要遗留老数据。

一些情况

  使用过程中,我注意到,并不是只有拖动超出屏幕的时候才会更新reusableCells表,还有:

  1. reloadData,这种情况比较特殊。一般是部分数据发生变化,需要重新刷新cell显示的内容时调用。在cellForRowAtIndexPath调用中,所有cell都是重用的。我估计reloadData调用后,把visiableCells中所有cell移入reusableCells,visiableCells清空。cellForRowAtIndexPath调用后,再把reuse的cell从reusableTableCells取出来,放入到visiableCells。

  2. reloadRowsAtIndex,刷新指定的IndexPath。如果调用时reusableCells为空,那么cellForRowAtIndexPath调用后,是新创建cell,新的cell加入到visiableCells。老的cell移出visiableCells,加入到reusableCells。于是,之后的刷新就有cell做reuse了。

时间: 2024-11-06 11:43:58

tableView中cell的重用机制的相关文章

解决tableView中cell动态加载控件的重用问题

tableView的cell,有时候需要在运行时取得对应的数据后才能够动态的创建该cell中的控件并加载到该cell中,此时,你一定会遇到重用问题,即使你能做到该cell只根据数值加载了一回控件,你也没法保证不出现重用问题:) 效果(请注意查看,移动下面的格子时,上面出现了重用的问题) 源码: YXCell.h // // YXCell.h // YXTableView // // Copyright (c) 2014年 Y.X. All rights reserved. // #import

iOS-cell的重用机制

对于像我们这样的初学者来说,cell重用机制是很难理解的内容,所以我们不一定非得理解,会用就行. cell的重用机制:当我们使用tableView时,系统只会创建屏幕中显示的cell的个数+1,当cell滑出可视范围时,会将此cell放出重用池,当有新的cell滑进可视范围时,先到重用池里去找,找不到就创建,找得到就直接用,所以会用串(有时候不会串<cell的个数小于3>) 防止用串的方法:1.设置标签2.不用重用池,直接创建3.拿出来用之前,清空原内容 一.设置标签(这是最常用的) cell

处理TableView中cell不同状态切换的问题

效果 说明 有时候,我们需要处理TableView中cell的各种状态,比如选中,未选中或者无效状态等,虽然我们都可以很容易的实现出来,但是考虑到代码的可读性以及可维护性,需要进行一定的设计才行. 1. 状态需要封装在Model中,让model自己管理 2. cell只需要判断model中的状态,然后进行相应的改变即可 源码 https://github.com/YouXianMing/TableViewState // // ModelData.h // TableViewState // /

IOS Table中Cell的重用reuse机制分析

原文:http://blog.csdn.net/omegayy/article/details/7356823 创建UITableViewController子类的实例后,IDE生成的代码中有如下段落: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = [NSString

cell的重用机制

重用机制 简单的说 意思 一行一行 的cell 都是在复用的, 滑动 tableview 的时候,刚离开视图的 cell 会被放到复用池 中,等下一个 cell需要 显示时,会先看复用池中有没有 cell 如果有的时候 ,就从复用池中拿出来cell ,没有的话就重新创建cell. 废话不多说直接上代码: // //  ViewController.m //  tableView // //  Created by WBapple on 15/12/1. //  Copyright © 2015年

【原】 从cellForRowAtIndexPath 看cell的重用机制

今天突然发现一个问题,由于对UITableViewCell 的重用机制不是很了解,让我纠结很久: 用过reloadData时候,会调用cellForRowAtIndexPath方法,但是请看以下2种cellForRowAtIndexPath 的写法: 写法A: -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    static NSStri

iOS中cell的重用

如果有cell的重用 那么就会跳过if语句中的创建过程 当拖动页面,最上面的cell消失,出现新的cell的时候 就会在缓存区存放刚才消失的cell,而属性会重新设置,为什么? 因为缓存区中存放的cell的属性是消失的cell的,他的属性如果不符合新的cell就需要重新分配属性, 一有新的cell出现,就会替换旧的位置,数量总保持在界面上显示的cell数量,不会增加也不会减少,这样就减轻了内存的压力

TableView 中cell间的分割线(及其他控件间(内)的分割线)设置

知识点: 1.在应用开发中,tableView中自带的分割线满足不了开发需求: 2.一些子空间中添加一些类似于分割线一样的东西等······ 补充知识点:导航条左侧或右侧的控件尽量靠近屏幕边缘设置 需求: 1.cell与cell之间需要一种白色的分割线: 2.cell的左侧能有视图标记此cell是被选中的,如下图所示: 实现方法: 1.左侧的红色选中标记: (1)左侧添加一个红色背景色的view,并设置其尺寸位置约束如下图: (2)通过代码设置其显示或隐藏的状态: 1 // 红色标记属性 2 @

IOS 延时加载TableView中Cell中的图片

TableView中图片延时加载是本文要介绍的内容,经常我们会用tableView显示很多条目,有时候需要显示图片.但是一次性从服务器上取来所有图片对用户来浪费流量,对服务器也是负担,最好是按需加载,即当该用户要浏览该条目时再去加载经常我们会用tableView显示很多条目. 有时候需要显示图片, 但是一次从服务器上取来所有图片对用户来浪费流量,,对服务器也是负担.最好是按需加载,即当该用户要浏览该条目时再去加载它的图片. 重写如下方法 - (void)tableView:(UITableVie