我正在使用SDWebImage
并从新闻API中抓取与新闻文章相关联的图片。
问题是,在我开始滚动UITableView
之前,屏幕上的单元格的图像未加载。一旦我滚过一个单元格,它就会离开屏幕,一旦我回到它,最终会加载图像。
以下是我的 (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
代码:
if ([feedLocal.images count] == 0) {
[cell.imageView setImage:[UIImage imageNamed:@"e.png"]];
}
else {
Images *imageLocal = [feedLocal.images objectAtIndex:0];
NSString *imageURL = [NSString stringWithFormat:@"%@", imageLocal.url];
NSLog(@"img url: %@", imageURL);
// Here we use the new provided setImageWithURL: method to load the web image
__weak UITableViewCell *wcell = cell;
[cell.imageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@", imageURL]]
placeholderImage:[UIImage imageNamed:@"115_64.png"]
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
if(image == nil) {
[wcell.imageView setImage:[UIImage imageNamed:@"115_64.png"]];
//];
}
}
];
}
知道为什么会这样吗?看起来当UITableView加载时,在滚动开始之前,图像不会被告知加载或其他东西?
非常感谢任何建议,谢谢!
答案 0 :(得分:5)
这几乎没有机会解决你的问题,但这太长了,不适合评论:
提示1:
如果您正在重复使用单元格,则不应在回调中执行[wcell.imageView setImage:]
。在执行回调代码时,wcell
将指向表视图中不同于您想要更改图像的单元格的非零机会。
相反,请使用indexPath
来引用您要修改的单元格:
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
if(image == nil) {
UITableViewCell *actualCell = [tableView cellForRowAtIndexPath:indexPath];
[actualCell.imageView setImage:[UIImage imageNamed:@"115_64.png"]];
}
}
请注意,如果您想要更改图片的单元格不再显示,cellForRowAtIndexPath:
将返回nil
,这绝对没问题:
返回值
表示表格单元格的对象,如果单元格不可见或indexPath超出范围,则为nil。
提示2:
当您已经拥有一个字符串时,无需重新创建字符串;)
[NSURL URLWithString:[NSString stringWithFormat:@"%@", imageURL]]
[NSURL URLWithString:imageURL] // imageURL is already a string
您的问题:
我有点困惑,你展示的代码实际上是SDWebImage
“操作方法”示例的简单应用,我刚刚使用框架的v3.3进行了测试,我的单元格更新了正好。因此,请尝试将代码减少到最低限度,以确定真正的问题。
我会说摆脱所有应用程序逻辑(例如feedLocal.images
),然后找出问题是否实际来自SDWebImage
。
答案 1 :(得分:1)
检查:
[cell.imageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@", imageURL]] placeholderImage:[UIImage imageNamed:@"115_64.png"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
if(image == nil)
{
[wcell.imageView setImage:[UIImage imageNamed:@"115_64.png"]];
}
else
{
dispatch_sync(dispatch_get_main_queue(), ^{
[cell.imageView setImage:image];
});
}
}];
答案 2 :(得分:1)
我之前遇到过类似的问题,原来桌面视图中的图片正确下载。您面临的真正问题是刷新问题。下载每个图像时,必须刷新它才能在tableview中显示。在我的例子中,下载部分是在一个单独的文件中完成的,所以我使用NSNotificationCenter告诉tableview控制器类刷新它。以下是您可以使用代码执行的操作:
if ([feedLocal.images count] == 0) {
[cell.imageView setImage:[UIImage imageNamed:@"e.png"]];
}
else {
Images *imageLocal = [feedLocal.images objectAtIndex:0];
NSString *imageURL = [NSString stringWithFormat:@"%@", imageLocal.url];
NSLog(@"img url: %@", imageURL);
// Here we use the new provided setImageWithURL: method to load the web image
__weak UITableViewCell *wcell = cell;
[cell.imageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@", imageURL]]
placeholderImage:[UIImage imageNamed:@"115_64.png"]
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
if(image == nil) {
[wcell.imageView setImage:[UIImage imageNamed:@"115_64.png"]];
[[NSNotificationCenter defaultCenter] postNotificationName:@"ImageDownloaded" object:nil];
//];
}
}
];
}
然后您可以使用它来调用重新加载数据,如下所示:
- (void) imageDownloaded:(NSNotification *)notification{
[self.tableView reloadData];
}
这样您无需滚动即可查看图像,而是在下载后立即显示。
希望这有帮助!
答案 3 :(得分:1)
不确定您是否已解决问题,但我通过以下代码解决了问题。
基本思想是设置块内可用的单元格引用,并在完成的方法中手动设置单元格的图像。希望它有所帮助。
__block UITableViewCell *cell2 = cell;
id data = [[self itemArray] objectAtIndex:[indexPath item]];
if ([data isKindOfClass:[MyItems class]]) {
MyItems *myData = (MyItems *)data;
[[cell2 imageView] setImageWithURL:[myData url]
placeholderImage:[UIImage imageNamed:@"placeHolder.png"]
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
// do check that this is the right cell to put your image
// your methods here
if (image) {
[[cell2 imageView] setImage:image];
}
}];
}
为了检查这是否是正确的单元格,我猜它是这样的(我没有时间检查它)
__block UITableViewCell *cell2 = cell;
id data = [[self itemArray] objectAtIndex:[indexPath item]];
if ([data isKindOfClass:[MyItems class]]) {
__block MyItems *myData = (MyItems *)data;
[[cell2 imageView] setImageWithURL:[myData url]
placeholderImage:[UIImage imageNamed:@"placeHolder.png"]
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
// do check that this is the right cell to put your image
// your methods here
id currentData = [[self itemArray] objectAtIndex:[indexPath item]];
if ([currentData isKindOfClass:[MyItems class]] && [ [[(MyItems *)currentData url] absoluteString] isEqualToString:[[myData url] absoluteString] ]) {
// it is the right cell to put in :)
if (image) {
[[cell2 imageView] setImage:image];
}
}
}];
}
答案 4 :(得分:0)
NSString *mainimg=[NSString stringWithFormat:@"%@",[[xmlDataDictionary valueForKeyPath:@"eg.main.img1"]objectAtIndex:indexPath.row]];
NSURL *url = [NSURL URLWithString:mainimg];
NSData *imge = [[NSData alloc] initWithContentsOfURL:url];
cell.img.image=[UIImage imageWithData:imge];