iOS开发经验

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

2017-02-24  本文已影响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-

上一篇下一篇

猜你喜欢

热点阅读