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];
        }
    }

     从上述代码可得,通过对cell的子视图从后到前遍历,直到所有子视图全部从父视图中移除。至于,为什么这里是从cell.contentView中移除,因为这样这样是现实的话,仅仅需要替换数据的子视图放到直接放到cell中,而需要重新生成子视图的就放置到cell.contentView中,这样就可以避免无谓的子视图生成的消耗。

0 0
原创粉丝点击