在 UITableViewCell 中,UIImageView 内容在使用 AFNetworking 的某些单元格之后重复

Posted

技术标签:

【中文标题】在 UITableViewCell 中,UIImageView 内容在使用 AFNetworking 的某些单元格之后重复【英文标题】:In UITableViewCell, UIImageView content repeats after some cells using AFNetworking 【发布时间】:2015-06-08 20:58:23 【问题描述】:

第一页上所有单元格的内容都是不同的,但当我们向下滚动时,只有UIImageView重复,尽管UILabels 不同 .

我正在使用AFNetworking 中的[UIImageView setImageWithURL:(NSURL *)url],它包含在RestKit 中。这是实现

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    RClubTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"RClubTableViewCell"];
    RClubObject * club = _clubs[indexPath.row];
    [cell.clubImageView setImageWithURL:[NSURL URLWithString:club.clubImageURL]];
    cell.nameLabel.text = club.clubName;
    return cell;

似乎ios 以某种方式使用了先前创建的单元格。希望在滚动时拥有全新的单元格。

【问题讨论】:

【参考方案1】:

您需要使用非零占位符图像调用 setImageWithURL:placeholderImage: 以从图像视图中删除旧图像。

【讨论】:

它仍在重复图像:-( 记录你为每一个使用的url,检查占位符图片(你见过吗) 是的,当实际图像尚未加载时,我看到了占位符图像。 NSLog 中的所有 URL 也是不同的。 iOS 正在重用单元格,您可以通过出列请求它,如果您愿意,可以初始化新单元格。如果您看到占位符和欺骗图像,那么您的 URL 是错误的,或者 AFN 代码中存在错误... 最后,它对我有用,虽然我不知道如何。我以前在iOS上也发生过这样的事情:-(。我创建了另一个UIImageView并丢弃了前一个。它与旧的完全相同。实际上它是Xcode提供的带有Clip SubViews的默认UIImageView和Aspect Fill 。然后它就起作用了 :-( 。我尝试清理代码,甚至删除了 DerivedData 文件夹。但这没有用 :-/ 。如果您能在这方面有所启发,那将非常有帮助 1 【参考方案2】:

我猜你错过了cellForRowAtIndexPath: 中的重新分配 你的代码应该是这样的

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    RClubTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"RClubTableViewCell"];
    if(cell == nil)
    
       cell = [[RClubTableViewCell alloc] init];
    
    RClubObject * club = _clubs[indexPath.row];
    [cell.clubImageView setImageWithURL:[NSURL URLWithString:club.clubImageURL]];
    cell.nameLabel.text = club.clubName;
    return cell;

更新:

好的。我只是有同样的问题。这是我在谷歌上的搜索告诉我的:由于您正在异步下载图像并且还在滚动,它会被下载并附加到当前可见的其他单元格

解决方案:

    使用 indexpath.row 为每个 imageView 添加标签 使用函数setImageWithURL: placeholderImage:success: 在成功块中使用标记值重新加载单元格。

虽然我没有对此进行测试,但我觉得这应该可以。 PS:让我知道这是否有效,我也必须这样做:)

【讨论】:

试过了。不起作用:-(。它永远不会进入那种状态。【参考方案3】:

是的,iOS 正在重用之前创建的单元格。这就是这行代码的作用,因此应用程序不必花时间从头开始创建新单元格:

RClubTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"RClubTableViewCell"];

在为该单元格添加新图像之前,从回收的单元格中清除图像:

cell.clubImageView.image = nil;
[cell.clubImageView setImageWithURL:[NSURL URLWithString:club.clubImageURL]];
cell.nameLabel.text = club.clubName;
return cell;

或者,您可以从头开始创建一个新单元格,而不是让一个单元格出列。

【讨论】:

以上是关于在 UITableViewCell 中,UIImageView 内容在使用 AFNetworking 的某些单元格之后重复的主要内容,如果未能解决你的问题,请参考以下文章

动态调整 UITableViewCells 的大小

在单个 UITableViewCell 中管理多个 UITextField

在 UITableViewCell 中调整 UITextView 的大小

在 UITableViewCell 中自动调整 UITextField 的大小

自定义 UITableViewCell 未出现在表格中

UITableViewCell 存储在其他数组中