[iOS]关于TableViewCell的理解以及reuseIdentifier的意义
来源:互联网 发布:剑三纯阳成男脸型数据 编辑:程序博客网 时间:2024/04/30 01:17
相信很多人多下面这段代码都非常的熟悉。
在使用TableView的时候,下面一段代码是必须的,也是最标准的,也是最核心的:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CMainCell = @"CMainCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CMainCell]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CMainCell] autorelease]; } //自定义cell的内容 cell.textlabel.text = @"XXX"; return cell; }
可以这样理解这段代码。
uitableviewcellll有一个队列用来专门存放那些生成过的,但是后来由于滚动tableView而隐藏起来的cell,
比如一个table有20个cell,
但是屏幕只能显示5个,(当然iPhone5可能会显示6个),那么就会有其他的cell没有显示出来,
但是在滑动tableview的时候便会显现。
而代码中:
static NSString *CMainCell = @"CMainCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CMainCell];
就是从队列中根据标示符取出一个暂时不用的cell,只有cell为nil,也就是队列中没有旧的cell的时候,
才会执行:
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CMainCell] autorelease];
以此生成一个新的cell。
如果有旧的,就不用执行这个语句了,这样节省资源,算作一种重用。
在tableView初始化的时候队列中肯定没有cell的,所以每个cell生成的时候都会执行一遍这个代码:
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CMainCell] autorelease];
当屏幕显示满了,向上滚动显示下一行时,就会把第一行隐藏,放到那个队列中,
然后新增加的一行执行语句:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CMainCell];
当然,上面这样对于使用系统提供的cell格式(左中右的结构)是没有什么问题,
但是如果自己在cell上添加一些控件时(自定义cell的tableview),
比如添加一个label和button的时候,有时就会出现问题。注意,是有时。
比如,在各个cell的label的文字不相同时。
首先这个添加的过程一定要在语句:
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CMainCell] autorelease];
}
之后,这样才是一次添加,
如果放在语句:
cell.textlabel.text = @"XXX";
之后,那么由于cell的重用可能旧的上面已经有label了,你再添加一个,造成多次添加。
其次label的文本值必须保证每次都要重新设置,也就是在语句:
cell.textlabel.text = @"XXX";
之后设置,这样才能保证每次必须执行。
如果放在语句:
后面,那么当使用旧的cell时,仍会保留旧的label文字,这是不对的。
所以是在:
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CMainCell] autorelease];
}
后添加,在:
cell.textlabel.text = @"XXX";
关于语句:
static NSString *CMainCell = @"CMainCell";
如果每个cell的结构完全相同,那没问题,就用这一个标识符,
但是如果各个cell结构不完全相同,有的有textfield,有的有button,有的有switch,
那就不能互相重用了,只能每行用不同的标识符了,
可以方便的利用(@"CMainCell%d", indexPath.row),保证不会重复,
多组的再加上组号。
那这还有必要用cell的重复利用吗?
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CMainCell];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CMainCell] autorelease];
}
还是需要的。
因为当自己滚动隐藏,下次再显示出来的时候,还是可以重用的。
标识符完全可以每次用一个新的,但为了最大限度的重用性,节省资源,才想了这么多办法。
巧妙地利用tag可以让你的cell无懈可击。
- [iOS]关于TableViewCell的理解以及reuseIdentifier的意义
- [iOS]关于TableViewCell的理解以及reuseIdentifier的意义
- [iOS]关于TableViewCell的理解以及reuseIdentifier的意义
- iOS TableViewCell ~reuseIdentifier(标识符)
- iOS关于tableViewCell的视图层次
- iOS TableViewCell 的伸缩
- 关于对复数物理意义的理解
- iOS TableViewCell的使用总结
- iOS tableVIewCell的使用总结
- iOS tableVIewCell的使用总结
- 关于tableviewcell的一些属性
- 关于tableViewCell重用的问题
- 关于tableViewCell 的重用若干问题
- 关于TableViewCell的重用机制
- 关于tableViewCell的一些事情
- 根据TableViewCell的subviews得到对应的TableViewCell以及NSIndexPath
- 关于IOS的Autolayout特性的理解以及使用
- 关于IOS的Autolayout特性的理解以及使用
- 当webview遇到了Slidingmenu,webView出现卡白,解决方案
- 如何在SharePoint 2013 的Master page 中引入Jquery
- 用Sencha Touch SDK TOOLS 编译Sencha touch 2 程序
- 转载:个图形爱好者的书架.-也来介绍一下我的藏书.
- 平衡二叉树的java实现
- [iOS]关于TableViewCell的理解以及reuseIdentifier的意义
- 零碎笔记
- 解决--“处理 function <SNR>19_Tlist_Refresh_Folds 时发生错误”的提示
- 黑马程序员——I/O
- 网页布局
- mac 下terminal 输入 svn ci命令的 提交失败的解决办法
- java synchronized详解
- C++ map的基本操作和使用
- 使用Netbeans进行PHP开发