UITabelViewCell的数据混叠显示
来源:互联网 发布:玻璃破碎按钮 淘宝 编辑:程序博客网 时间:2024/05/18 01:20
以上现象与UITableView是有复用机制与延迟加载的两个特性相关。
关于延迟加载,因为cell图形显示的开销比存储model的开销要大很多,而且由于屏幕大小的限制,因此无论如何,在屏幕上一次出现的cell的数据量都是有限的,因此若一次性地把所有cell生成,是一种很不现实的做法,因此iOS采用延迟加载的方式,但view需要显示哪个cell的数据,就通过dataSource protocol协议实现数据的现实。
关于复用机制,同样由于屏幕一次能显示的cell的数量有限,而且创建与释放cell都是需要一定的开销,所以采用若发生滚动事件时,就释放不存在屏幕中的cell,创建新的cell的方式是低效极其不合理的。
所以iOS的tableView采用以下的cell复用机制(CollectionView也如此):
//上图流程的实现代码
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *identification = @"hehe";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identification];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identification];
}
cell.textLabel.text = @"喵";
return cell;
}
结合上图与代码可得,每当cell不够用的时候,就回通过[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identification];方法生成cell,若cell足够用,而屏幕有移动行为时,移出屏幕的cell就会被快速回收并填充上新的数据,然后被用于显示。所以[tableView dequeueReusableCellWithIdentifier:identification]方法就是通过reuseIdentifier重用id来搜索还存在未被使用的cell的方法。
结合对cell重用机制的原理的理解,在使用非自定义cell的过程中,重用的数据重装过程只是数据的替换,而本项目中的数据重装过程是不断地通过添加带数据的子视图,因此就出现了子视图的混叠情况。所以解决方案就是在取得重用的cell时移除所有子视图,实现代码如下:
LogCell *cell = [tableViewdequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[LogCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:ID];
}else{
while (cell.contentView.subviews.lastObject!=nil) {
[cell.contentView.subviews.lastObjectremoveFromSuperview];
}
if (cell == nil) {
cell = [[LogCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:ID];
}else{
while (cell.contentView.subviews.lastObject!=nil) {
[cell.contentView.subviews.lastObjectremoveFromSuperview];
}
}
从上述代码可得,通过对cell的子视图从后到前遍历,直到所有子视图全部从父视图中移除。至于,为什么这里是从cell.contentView中移除,因为这样这样是现实的话,仅仅需要替换数据的子视图放到直接放到cell中,而需要重新生成子视图的就放置到cell.contentView中,这样就可以避免无谓的子视图生成的消耗。
0 0
- UITabelViewCell的数据混叠显示
- UITabelViewCell的显示格式
- UITabelViewCell高度的自适应
- iOS UITabelViewCell的点击跳转事件
- iOS UITabelViewCell点击获得cell的text属性值
- 自定义UITabelViewCell
- 数据的十六进制显示
- 显示数据的方法。
- 大数据的显示
- MATLAB的数据显示格式
- 导出显示数据的Execl
- gridview的数据显示格式
- XML数据的分页显示
- MATLAB的数据显示格式
- gridview的数据显示格式
- 显示数据碎片的SQL
- 显示double类型的数据
- Jsp显示HBase的数据
- MVC导出
- POJ3497 UVA12124 Assemble(二分 + 贪心)
- 几种常用数据库的JDBC URL
- cvZero
- Toast的使用
- UITabelViewCell的数据混叠显示
- doPost()和doGet()
- 设计由两个栈组成的队列
- 面试笔试题记录
- 【UIKit-124-1】#import <UIKit/UIView.h>
- tomcat安装与配置,Eclipse集成与配置,首个程序发布
- 按钮应用(剪切,复制,粘贴)
- LintCode--买卖股票的最佳时机 II
- C++中POD类型