上线前, 对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-
网友评论