当我在tableview上滚动时,有时在我的tableview单元格中设置了错误的图像。我怎样才能解决这个问题?以下是我cellForRowAtIndexPath
方法中的相关代码。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul), ^{
UIImage * image = [UIImage imageWithData: [NSData dataWithContentsOfURL:[NSURL URLWithString:self.myURL]]];
dispatch_sync(dispatch_get_main_queue(), ^{
cell.myImageView = image;
});
});
return cell;
}
答案 0 :(得分:2)
首先检查您的手机是否为nill,然后设置图像。 Becouse cell在滚动时重复使用。
请参阅以下代码,它将为您提供帮助。
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul), ^{
UIImage * image = [UIImage imageWithData: [NSData dataWithContentsOfURL:[NSURL URLWithString:self.myURL]]];
dispatch_sync(dispatch_get_main_queue(), ^{
cell.myImageView = image;
});
});
}
return cell;
答案 1 :(得分:1)
您的图像数据是异步下载的,但在重复使用时不会被取消。
因为UITableViewCells被重用,所以这些类型的异步调用需要在单元重用时被取消,否则它们可以在你已经将新数据加载到它们中时完成。
我的建议是使用像SDWebImage这样的库来加载你的图像。它使用比上面列出的更少的代码下载,缓存和显示您的图像。
答案 2 :(得分:1)
我对您的代码做了一些更改,我认为它会对您有所帮助
cell.myImageView = nil; // or cell.myImageView = [UIImage imageNamed:@"placeholder.png"];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:self.myURL]];
NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (data) {
UIImage *image = [UIImage imageWithData:data];
if (image) {
dispatch_async(dispatch_get_main_queue(), ^{
MyCell *myCell = (id)[tableView cellForRowAtIndexPath:indexPath];
if (myCell)
myCell.myImageView = image;
});
}
}
}];
[task resume];
return cell;
并使cell.myImageView = nil;或者在
中设置占位符图像- tableView:didEndDisplayingCell:forRowAtIndexPath:
或
您只需使用 SDWebImage 即可 tutorial link
答案 3 :(得分:0)
试试这段代码。您需要在发生错误时将图像设置为nil,或者在url
中获取数据时不形成图像let request = NSMutableURLRequest.init(URL: NSURL.init(string: "self.myURL")!)
let dataTask = NSURLSession.sharedSession().dataTaskWithRequest(request){(data, response, error) in
if let imageData = data
{
let image = UIImage.init(data: data!)
if((image) != nil)
{
dispatch_async(dispatch_get_main_queue(), ^{
cell.myImageView = image
});
}
else
{
cell.myImageView = nil;
}
}
else
{
cell.myImageView = nil
print(error?.description)
}
}
dataTask.resume();
*