美文网首页
UITableViewCell重用,重复显示解决方案

UITableViewCell重用,重复显示解决方案

作者: WestMountain | 来源:发表于2016-05-16 22:38 被阅读773次
    //通常我们是这样来是cell重用
    //如果超过页面显示的内容就会重复出现,遇到重复显示的Bug
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *identifier = @"Cell";
        // 通过唯一标识创建cell实例
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
        // 判断为空进行初始化  --当拉动页面显示超过主页面内容的时候就会重用之前的cell,而不会再次初始化
        if (!cell) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }
        
        cell.textLabel.text = @"text";
      
        cell.imageView.image = [UIImage imageNamed:@"imageName"];
        
        return cell;
    }
    
    

    解决方案有以下几种

    //1)思路:不设置cell的重用机制,通过indexPath来创建cell,来解决重复显示的问题,在数据量大的情况下不推荐使用
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *identifier = @"Cell";
        // 通过indexPath创建cell实例 每一个cell都是单独的
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        // 判断为空进行初始化  --(当拉动页面显示超过主页面内容的时候就会重用之前的cell,而不会再次初始化)
        if (!cell) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
        }
     
        cell.textLabel.text = @"text";
     
        cell.imageView.image = [UIImage imageNamed:@"imageName"];
        
        return cell;
    }
    
    //2)思路:让每个cell都有一个对应的标识 这样做也会让cell无法重用 所以也就不会是重复显示了 同样在数据量大的情况下不推荐使用
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {  
        NSString *identifier = [NSString stringWithFormat:@"cell%ld%ld",indexPath.section,indexPath.row];
        // 通过indexPath创建cell实例 每一个cell都是单独的
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        // 判断为空进行初始化  --(当拉动页面显示超过主页面内容的时候就会重用之前的cell,而不会再次初始化)
        if (!cell) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
        }
     
        cell.textLabel.text = @"text";
     
        cell.imageView.image = [UIImage imageNamed:@"imageName"];
        
        return cell;
    }
    
    3)思路:只要最后一个显示的cell内容不为空,然后把它的子视图全部删除,等同于把这个cell单独出来了 然后跟新数据就可以解决重复显示
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {  
       static NSString *identifier = @"Cell";
        // 通过唯一标识创建cell实例
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
        if (!cell) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
        }else//当页面拉动的时候 当cell存在并且最后一个存在 把它进行删除就出来一个独特的cell我们在进行数据配置即可避免
        {
            while ([cell.contentView.subviews lastObject] != nil) {
                [(UIView *)[cell.contentView.subviews lastObject] removeFromSuperview];
            }
        }
        cell.textLabel.text = @"text";
     
        cell.imageView.image = [UIImage imageNamed:@"imageName"];
        
        return cell;
    }
    

    相关文章

      网友评论

          本文标题:UITableViewCell重用,重复显示解决方案

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