我的tableView:cellForRowAtIndexPath
方法中使用了以下代码。
我使用AFNetworking的setImageWithURLRequest
来显示单元格的图像。
但是,有时会在我的tableView中的单元格上放置错误的图像。
我认为错误是触发成功块并且contact
对象不再对应于已下载的图像。
// ... init/deque ...
/* CAN BE EITHER USER OR CONTACT DETAILS */
id contact = [[self.connections objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
if ([contact isKindOfClass:[User class]]) {
[cell configurateCellWithUser:(User *)contact];
if(((User*)contact).avatar_name.length > 0){
[cell.profilePicture setImageWithURLRequest:[self getURLRequestForUser:contact]
placeholderImage:[UIImage imageWithData:((User*)contact).avatar_image]
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
cell.profilePicture.image = image;
((User*)contact).avatar_image = UIImageJPEGRepresentation(image, 0.01);
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
cell.profilePicture.image = [UIImage imageNamed:@"avatar_contact-card"];
}];
}else {
[cell.profilePicture setImage:[UIImage imageNamed:@"avatar_contact-card"]];
}
} else {
[cell.profilePicture setImage:[UIImage imageNamed:@"avatar_contact-card"]];
[cell configurateCellWithContactDetails:(ContactDetails *)contact];
}
return cell;
如何修复此问题并为正确的单元格显示适当的图像?
答案 0 :(得分:1)
您可能没有正确准备表格单元格以供重复使用。由于重用或网络请求失败,当图像请求无法到达其UIImageView接收器时,这可能会导致您看到旧图像。此外,URL请求可能会出现故障,导致正确的图像被可能已被延迟的先前网络请求覆盖。
您需要确保清除profilePicture
imageView并取消任何可能导致图片稍后更改的待处理网址请求。
将以下代码放在UITableViewCell子类中:
- (void)prepareForReuse {
[self cancelImageRequestOperation];
self.profilePicture.image = nil;
}
确保您已在UITableViewCell中导入UIImageView + AFNetworking类别:
#import UIImageView+AFNetworking.h
答案 1 :(得分:0)
在将单元格出列后,尝试在cell.profilePicture.image
的开头设置nil
到tableView:cellForRowAtIndexPath:
。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
Cell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
cell.profilePicture.image = nil;
//the rest of your code.
}