我有一个带有集合视图的应用程序应该显示图像缩略图。该应用程序首先需要下载一个json字符串,其中包含从中下载缩略图的URL。
我遇到的问题是集合视图单元格没有显示图像,尽管代码正在下载这些图像。
代码
查看控制器界面:
@interface NewsfeedController : UICollectionViewController <UICollectionViewDataSource, UICollectionViewDelegate>
@property (weak, nonatomic) IBOutlet UILabel *rawNewsfeed;
@property NSMutableArray *newsfeedPosts;
@property (weak, nonatomic) IBOutlet UICollectionView *newsfeedCollectionView;
@end
控制器的viewDidLoad
包括以下行:
[self.newsfeedCollectionView registerClass:[PostCellView class] forCellWithReuseIdentifier:@"PostCellView"];
单元格是自定义单元格,由此类定义:
PostCellView.h
@interface PostCellView : UICollectionViewCell
@property (nonatomic) IBOutlet UIImageView *posterImageView;
@end
在视图控制器中,我已经像这样实现了 cellForItemAtIndexPath 方法:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
PostCellView *postCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"PostCellView" forIndexPath:indexPath];
if(!postCell){
postCell = [[PostCellView alloc]init];
}
long row = indexPath.row;
PostModel *post = [self.newsfeedPosts objectAtIndex:row];
NSURL *posterUrl = [NSURL URLWithString:post.media[@"poster"]];
NSURLSessionDataTask *getPosterImage = [[NetworkHelper getInstance].session dataTaskWithURL:posterUrl completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
UIImage *posterImage = [UIImage imageWithData:data];
postCell.posterImageView = [[UIImageView alloc] initWithImage:posterImage];
});
}];
[getPosterImage resume];
return postCell;
}
如您所见,我正在下载缩略图异步的图像,因此在下载完成后,我尝试通过在主队列上的dispatch_async中设置 posterImageView 来更新UI。但是,UI永远不会使用缩略图进行更新。在调试时查看视图层次结构,应用程序确实创建了我期望的8个单元格,但同样,图像永远不会显示。
因此,从本质上讲,一旦通过异步过程下载这些图像,我无法使我的应用程序的集合视图中的单元格显示相应的图像。
答案 0 :(得分:1)
基于rdelmar上面的评论,问题在于这一行:
postCell.posterImageView = [[UIImageView alloc] initWithImage:posterImage];
我正在初始化一个已经被宣布为IBOutlet的图像视图。所以我改变了这一行,图像开始显现:
postCell.posterImageView.image = posterImage;