文档章节

理解Cell的注册与重用机制

费
 
发布于 2016/02/20 18:31
字数 794
阅读 35
收藏 0

##问题 在TableView中,我们经常需要加载非常非常多的Cell,每个Cell都有独立的内容。这时,如何才能保证你的TableView不会因加载过多Cell而挂掉呢?

Apple给出的解决办法是重用Cell

##Cell的加载与重用 TableView中维护着一个cell重用队列。当TableView第一次加载时,重用队列是空的。同时,TableView调用-(UITableViewCell *)tableView: cellForRowAtIndexPath:,用于加载屏幕可视区域中的Cell(注意噢!只加载可是区域的Cell)。iPhone可视区域有限,一般只能容纳15个左右的Cell。

当滚动TableView时,部分Cell会脱离可视区域。这些脱离了可视区域的Cell并不会被delloc销毁,而是放到重用队列中。

在滚动的同时,另一些新的Cell会进入可视区域。此时由于重用队列中存在可重用的Cell,因此TableView并不会alloc创建新的Cell,而是从重用队列中取出Cell,并给text,image等附上新的值,以供那些新进入可视区域的Cell使用。

开启重用机制

开启重用机制有两种方式:

1. 远古的手工办法(可用但不推荐)

这种做法的思路是: 每次TableView在请求需要一个可重用的Cell时,手工进行一次非空判断,如果存在可重用的Cell,则使用它,否则就alloc创建一个新的Cell。

static NSString *CellIdentifier = @"CellIdentifier";
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];
    if(cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:SimpleTableIdentifier];
    }
    cell.textLabel.text = @"new text";
    return cell;
}

2. 使用注册机制开启重用机制

注册机制会对一种类型的Cell进行注册,注册的结果是:

  • 当TableView需要从重用队列中获取Cell,但重用队列为空时,则自动alloc创建新的Cell。
  • 当TableView需要从重用队列中获取Cell,且重用队列中有可重用的Cell时,TableView优先使用可重用的Cell,而不是创建新的Cell。

我们需要根据创建Cell的方式,选择正确的方法对cell进行注册和重用。下面讲到的三种创建cell的方式可参考自定义Cell的三种方式

####A. 使用纯代码创建cell 直接在代码中对cell注册。

//现在ViewDidload中注册
static NSString *CellIdentifier = @"CellIdentifier";
- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.tableView registerClass:[MyCell class] forCellReuseIdentifier: CellIdentifier];
    
//然后就不用判断可重用Cell是否为nil了
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
	MyCell *myCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
	myCell = @"new text";
	return myCell;
}

####B. 使用storyboard + 代码的方式 只需在storyboard中设置Cell的Identifier即可。需要注意的是,如果在使用了自定义cell,千万不要同时在storyboard和代码中对cell进行注册,这会造成cell渲染失败,一片空白。

####C. 使用xib + 代码 xib方式的cell只需在代码中注册即可。

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.dataSource = @[@"1", @"2", @"3"];
    
    UINib *nib = [UINib nibWithNibName:@"CellXib" bundle:nil];
    [self.tableView registerNib:nib forCellReuseIdentifier:CellIdentifier];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    NSString *str = [self.dataSource objectAtIndex:indexPath.row];
    [cell setTheValue:str];
    return cell;
}

##Reference http://www.douban.com/note/232238166/

© 著作权归作者所有

费

粉丝 2
博文 13
码字总数 6589
作品 0
南宁
私信 提问
自定义UITableViewCell

自定义UITableViewCell大致有两类方法: <一>使用nib 1、xib中指定cell的Class为自定义cell类型(注意不是设置File's Owner的class) 2、调用 tableView 的 registerNib:forCellReuseIdenti......

马尔代夫的沙滩
2016/04/09
45
0
tableview的多个类型自定义cell的数据重用解决方案

UITableView继承自UIScrollview,是苹果为我们封装好的一个基于scroll的控件。上面主要是一个个的UITableViewCell,可以让UITableViewCell响应一些点击事件,也可以在UITableViewCell中加入UIT...

奋斗的青春年华
2016/12/22
13
0
注册cell可重用单元格注意事项

在storyboard中已经注册了cell的可重用标识符 点击cell时 push到下一个视图控制器后 如果 再用代码 注册一边cell的可重用单元格 会覆盖之前 // 视图被加载完成之后被调用,stroyboary中的原型...

马尔代夫的沙滩
2016/04/06
39
2
iOS开发之自定义UITableViewCell

等高的Cell 一、storyboard方式 创建一个继承自UITableViewCell的子类 在storyboard中 - 往cell里面增加需要用到的子控件 - 设置cell的重用标识 - 设置cell的class为我刚才创建的那个Cell类型...

shenhuniurou
2016/03/17
163
0
UItableView的cell优化

tableViewCell的常见设置 TableViewCell的循环使用 循环使用的原理 首先,我们在手机界面的看到的的展示时,假设我们看到展示在界面上,那么实际中系统给我们创建了个cell,即为我们看到个cell ...

追逐iOS
04/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

以太坊私有链搭建

https://blog.csdn.net/Blockchain_lemon/article/details/80589123

Moks角木
40分钟前
1
0
自律给我自信-为什么要自律

为什么要自律 混一天和努力一天 看不到任何差别 3天看不到任何变化 7天也看不到任何效果 但是 1个月后, 会看到话题不同 3个月后, 会看到气场不同 6个月后, 会看到距离不同 3年后, 会看到...

周大壮
40分钟前
1
0
读书replay计划说明

突然脑袋一闪,我有了这样一个主意:通过写博客的方式,将我阅读的书中的内容replay出来。 我一般会找着我感兴趣的书去读,一般也会读书中我感兴趣的章节,或者当下对我有用的章节,所以这个...

wanxiangming
42分钟前
0
0
CentOS7安装xrdp环境可实现远程桌面访问

CentOS7安装xrdp环境可实现远程桌面访问 2018-07-14 06:39:28 分类:运维 阅读(2051) 评论(0) 在"Ubuntu系统安装xrdp桌面客户端及实现远程连接桌面"文章中有分享过在Ubuntu系统中安装XRDP环境...

linjin200
今天
5
0
ConfigurationProperties

package cn.enjoy.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @ConfigurationProperties(pr......

少年已不再年少
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部