iOS中UITableView学习笔记(二)之cell重用
2014-02-11 10:22
357 查看
在学习笔记(一)中降到了如何创建一个cell和自定义cell。这里讲一下UITableViewCell的重用机制。
UITableView会通过重用cell来达到节省内存的目的:通过为每个cell指定一个重用标识符(reuseIdentifier),即指定了单元格的种类,当cell滚出屏幕时,会将滚出屏幕的单元格放入重用的queue中,当某个未在屏幕上的单元格要显示的时候,就从这个queue中取出单元格进行重用。
每一个UITableView里都维护着一个cell队列,当UITableView刚加载的时候,cell队列里是没有任何数据的。dequeueResableCellWithIdentifier从字面上理解就是”列出可重用的cell",也就是根据一个标识identifier从cell队列里取出一个UITableViewCell,当然了,如果cell队列里没有此标识的cell,调用此方法的结果就是返回nil。因此,在UITableView刚加载的时候,cell队列里没有可用的cell,所以必须通过语句
来创建对应CellIdentifier的UITableViewCell实例。
但对于变化的自定义cell,有时这种重用机制会出错。比如,当一个cell含有一个UIButton的子类并被放在重用queue中以待重用,这时如果一个未包含任何子视图的cell要显示在屏幕上,就会取出并使用这个重用的cell显示在无任何子视图的cell中,这样你就在这个未包含任何子视图的cell上显示了button。就会出错。
这个有二个解决方法:
方法一:
将上段代码中的
// UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//改为以下的方法
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; //根据indexPath准确地取出一行,而不是从cell重用队列中取出
这个方法的意思就是不使用重用机制,这样会浪费一些内存空间,因为你所有的cell都要被创建出来。适合你的cell数目不太多的情况。
方法二:
通过为每个cell指定不同的重用标识符(reuseIdentifier)来解决。
重用机制是根据相同的标识符来重用cell的,标识符不同的cell不能彼此重用。于是我们将每个cell的标识符都设置为不同,就可以避免不同cell重用的问题了。
NSString
*CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];//以indexPath来唯一确定cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell
UITableView会通过重用cell来达到节省内存的目的:通过为每个cell指定一个重用标识符(reuseIdentifier),即指定了单元格的种类,当cell滚出屏幕时,会将滚出屏幕的单元格放入重用的queue中,当某个未在屏幕上的单元格要显示的时候,就从这个queue中取出单元格进行重用。
- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [table dequeueReusableCellWithIdentifier:@"CellIdentifier"]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"CellIdentifier"] autorelease]; } return cell; }
每一个UITableView里都维护着一个cell队列,当UITableView刚加载的时候,cell队列里是没有任何数据的。dequeueResableCellWithIdentifier从字面上理解就是”列出可重用的cell",也就是根据一个标识identifier从cell队列里取出一个UITableViewCell,当然了,如果cell队列里没有此标识的cell,调用此方法的结果就是返回nil。因此,在UITableView刚加载的时候,cell队列里没有可用的cell,所以必须通过语句
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
来创建对应CellIdentifier的UITableViewCell实例。
但对于变化的自定义cell,有时这种重用机制会出错。比如,当一个cell含有一个UIButton的子类并被放在重用queue中以待重用,这时如果一个未包含任何子视图的cell要显示在屏幕上,就会取出并使用这个重用的cell显示在无任何子视图的cell中,这样你就在这个未包含任何子视图的cell上显示了button。就会出错。
这个有二个解决方法:
方法一:
将上段代码中的
// UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//改为以下的方法
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; //根据indexPath准确地取出一行,而不是从cell重用队列中取出
这个方法的意思就是不使用重用机制,这样会浪费一些内存空间,因为你所有的cell都要被创建出来。适合你的cell数目不太多的情况。
方法二:
通过为每个cell指定不同的重用标识符(reuseIdentifier)来解决。
重用机制是根据相同的标识符来重用cell的,标识符不同的cell不能彼此重用。于是我们将每个cell的标识符都设置为不同,就可以避免不同cell重用的问题了。
NSString
*CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];//以indexPath来唯一确定cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell
相关文章推荐
- iOS之UITableView中的cell因为重用机制导致新的cell的数据出现重复或者错乱
- IOS Swift语言开发 tableView的重用以及自cell的自适应高度
- IOS TableView Cell重用机制及TableView
- [置顶] iOS cell上button互斥 重用问题解决方法
- iOS之UITableView Cell重用机制
- iOS tableView 的 cell上其它控件重用(利用view的tag属性巧妙实现重用,从xib中加在cell重载问题)
- IOS Table中Cell的重用reuse机制分析
- ios tableView那些事 UITableView中Cell重用机制导致内容重复解决方法
- iOS--当cell上显示不同数量图片的时候重用
- ios 重用UITableViewCell created from a XIB
- ios开发 UITableCell 可重用问题
- 记一个iOS开发中cell的重用机制引发的错误
- ios cell 重用问题--图片remove
- iOScell 重用解决办法
- IOS Table中Cell的重用reuse机制分析
- IOS TableView中Cell的重用reuse机制分析
- ios tableView那些事 (十六) UITableView中Cell重用机制导致内容重复解决方法
- iOS UITableViewCell重用问题
- ios tableView UITableView中Cell重用机制导致内容重复解决方法
- IOS Swift语言开发 tableView的重用以及自cell的自适应高度