Rea*_*omp 6 objective-c uitableview ios sdwebimage
我正在使用SDWebImage和抓取与新闻API中的新闻文章相关联的图像.
问题是,在我开始滚动之前,屏幕上的单元格图像没有加载UITableView.一旦我滚过一个单元格,它就会离开屏幕,一旦我回到它,最终会加载Image.
这是我的(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"]];
//];
}
}
];
}
Run Code Online (Sandbox Code Playgroud)
知道为什么会这样吗?看起来当UITableView加载时,在滚动开始之前,图像不会被告知加载或其他东西?
任何建议都非常感谢,谢谢!
这将解决您的问题的可能性很小,但这太长了,不适合评论:
提示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"]];
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果您想要更改图像的单元格不再显示,cellForRowAtIndexPath:将返回nil,这绝对没问题:
回报价值
表示表格单元格的对象,如果单元格不可见或者indexPath超出范围,则为nil.
提示2:
当你已经有一个字符串时,没有必要重新创建一个字符串;)
[NSURL URLWithString:[NSString stringWithFormat:@"%@", imageURL]]
[NSURL URLWithString:imageURL] // imageURL is already a string
Run Code Online (Sandbox Code Playgroud)
你的问题:
我有点困惑,你展示的代码实际上是一个简单的SDWebImage"how-to"示例应用程序,我刚刚使用框架的v3.3进行了测试,我的单元格更新得很好.因此,请尝试将代码减少到最低限度,以确定真正的问题.
我会说摆脱所有的应用程序逻辑(feedLocal.images例如),然后找出问题是否真的来自SDWebImage.
我之前遇到过类似的问题,结果发现表格视图中的图像下载正确。您面临的真正问题是刷新问题。下载每个图像后,必须刷新它才能显示在表格视图中。就我而言,下载部分是在单独的文件中完成的,因此我使用 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];
//];
}
}
];
}
Run Code Online (Sandbox Code Playgroud)
然后您可以使用它调用重新加载数据,如下所示:
- (void) imageDownloaded:(NSNotification *)notification{
[self.tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)
这样,您无需滚动即可查看图像,而是在下载后立即显示它们。
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
7973 次 |
| 最近记录: |