在 UITableViewCell 中,UIImageView 内容在使用 AFNetworking 的某些单元格之后重复
Posted
技术标签:
【中文标题】在 UITableViewCell 中,UIImageView 内容在使用 AFNetworking 的某些单元格之后重复【英文标题】:In UITableViewCell, UIImageView content repeats after some cells using AFNetworking 【发布时间】:2015-06-08 20:58:23 【问题描述】:第一页上所有单元格的内容都是不同的,但当我们向下滚动时,只有UIImageView
是重复,尽管UILabel
s 不同 .
我正在使用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 的某些单元格之后重复的主要内容,如果未能解决你的问题,请参考以下文章
在单个 UITableViewCell 中管理多个 UITextField
在 UITableViewCell 中调整 UITextView 的大小