美文网首页iOS开发经验
cell复用导致imageView重复显示的bug

cell复用导致imageView重复显示的bug

作者: 不懂冯先生 | 来源:发表于2017-02-24 12:03 被阅读346次

    上线前, 对APP进行了一番梳理, 发现cell的复用会导致cell(没有数据)上面的图片显示之前的有数据cell的img; 没有说明白吧, 看图

    cell的重复显示导致问题.gif

    试了网上之前说的好几种方法, 有的朋友是那种cell重用机制理解的有问题, 导致cell重复创建, cell上面的控件重复叠加, 网上大部分的解答都是这一种

    解决cell上面控件重复叠加的bug, 一般是三种方法

    方案一 通过不让他重用cell 来解决重复显示

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    
    {
    
    // 定义唯一标识
    
    static NSString *CellIdentifier = @"Cell";
    
    // 通过indexPath创建cell实例 每一个cell都是单独的
    
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    
    // 判断为空进行初始化  --(当拉动页面显示超过主页面内容的时候就会重用之前的cell,而不会再次初始化)
    
    if (!cell) {
    
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    
    }
    
    cell.textLabel.text = @"text";
    
    return cell;
    
    }
    

    方案二 同样通过不让他重用cell 来解决重复显示 不同的是每个cell对应一个标识

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    
    {
    
     定义cell标识  每个cell对应一个自己的标识
    
    NSString *CellIdentifier = [NSString stringWithFormat:@"cell%ld%ld",indexPath.section,indexPath.row];
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    // 判断为空进行初始化  --(当拉动页面显示超过主页面内容的时候就会重用之前的cell,而不会再次初始化)
    
    if (!cell) {
    
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    
    }
    
    cell.textLabel.text = @"text";
    
    return cell;
    
    }
    
    

    这一种方法也不能解决我的问题

    方案三 当页面拉动需要显示新数据的时候,把最后一个cell进行删除 就有可以自定义cell 此方案即可避免重复显示,又重用了cell相对内存管理来说是最好的方案 前两者相对比较消耗内存

    同样并没有解决问题

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    
    {
    
    // 定义唯一标识
    
    static NSString *CellIdentifier = @"Cell";
    
    // 通过唯一标识创建cell实例
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    // 判断为空进行初始化  --(当拉动页面显示超过主页面内容的时候就会重用之前的cell,而不会再次初始化)
    
    if (!cell) {
    
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    
    }
    
    else//当页面拉动的时候 当cell存在并且最后一个存在 把它进行删除就出来一个独特的cell我们在进行数据配置即可避免
    
    {
    
    while ([cell.contentView.subviews lastObject] != nil) {
    
    [(UIView *)[cell.contentView.subviews lastObject] removeFromSuperview];
    
    }
    
    }
    
    cell.textLabel.text = @"text";
    
    return cell;
    
    }
    

    一般重要的都在最后面, 哈哈哈...狗子你变了

    自己写一个cell继承UITableViewCell,然后在自己写的cell里面用prepareForReuse来把cell中的ImageView初始化,比如清空图片神马的

    下面贴代码

    /**
     解决cell复用ImageView重复显示问题
     */
    - (void)prepareForReuse {
        
        [super prepareForReuse];
        
        self.user_image1.image = nil;
        self.user_image2.image = nil;
        self.user_image3.image = nil;
        self.user_image4.image = nil;
        self.user_image5.image = nil;
        self.user_image6.image = nil;
        self.user_image7.image = nil;
        self.user_image8.image = nil;
      
    }
    

    哈哈哈, 有没有解决问题, 请点赞留言call我

    PS: 日积月累, 天天进步
    最近很焦虑, 上线的压力, 每天熬夜干项目, 过了一段没有爱的日子
    还是要胸怀梦想...奋斗...
    -END-

    相关文章

      网友评论

        本文标题:cell复用导致imageView重复显示的bug

        本文链接:https://www.haomeiwen.com/subject/vfqwwttx.html