我正在尝试将UICollectionView与多个图像集成。我动态地从API获取图像并使用SDWebImage库将其直接加载到UICollectionViewCell中。它对我来说很好。但是现在我正在尝试将下载的图像从文档目录加载到UICollectionViewCell中,它会在错误的单元格中显示图像。每次加载UICollectionViewCell或滚动时,图像都会在单元格中更改
-(void)setImageFromDocumentDirWithName:(NSString *)strImageName setImageToView:(UIImageView *)imgView imgURL:(NSURL *)url{
NSString *workSpacePath=[[Utility applicationDocumentsDirectory] stringByAppendingPathComponent:strImageName];
BOOL fileExists=[[NSFileManager defaultManager] fileExistsAtPath:workSpacePath];
if (fileExists) {
imgView.image=[UIImage imageWithData:[NSData dataWithContentsOfFile:workSpacePath]];
}
else{
[imgView sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"Default1"]];
}
}
当我直接从服务器加载图像时,它对我来说很好。但我想检查图像文件是否存在于我的文档目录中。如果是,则从文档目录加载它,否则从服务器加载它。 请提供宝贵的建议。
我在这里设置单元格
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *myCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell"
forIndexPath:indexPath];
UILabel *recipeNameLabel = (UILabel *)[myCell viewWithTag:200];
recipeNameLabel.text = [[arrAddSpace objectAtIndex:indexPath.row] objectForKey:@“name”];
UIImageView *imgSpace = (UIImageView *)[myCell viewWithTag:100];
NSString *strURL = [NSString stringWithFormat:@"%@",[[arrAddSpace objectAtIndex:indexPath.row] objectForKey:@"thumbnail_url"]];
if ([strURL length]!=0 || ![strURL isEqualToString:@""]) {
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",strURL]];
[self setImageFromDocumentDirWithName:[[arrAddSpace objectAtIndex:indexPath.row] objectForKey:@"thumbnail_url"] setImageToView:imgSpace imgURL:url];
return myCell;
}
}
答案 0 :(得分:0)
这是与重用细胞和细胞有关的问题。还将图像设置为不正确的单元格。
在UICollectionView或UITableView中,为了实现最大性能并减少内存消耗,使用了可重用单元的概念。基本概念是集合视图和表视图最初只创建可见单元格,当我们滚动时,已经创建的单元格被重用,需要使用相应索引路径(单元格)的内容更新单元格的子视图(容器)
在您创建集合视图的情况下,单元格的图像将正确显示,直到您滚动。但是一旦滚动,单元格就会重复使用,并且那些要在单元格上显示的图像不会显示在那里。
要解决此问题,您需要根据指向同一索引路径的单元格的索引路径的数据更新单元格的图像。
此外,如果您需要知道代码中的确切问题,请发布您创建单元格的来源并将图像设置为单元格。
答案 1 :(得分:0)
你能做一件事,只需在方法中添加一个参数“IndexPath” -
-(void)setImageFromDocumentDirWithName:(NSString *)strImageName setImageToView:(UIImageView *)imgView imgURL:(NSURL *)url
作为
-(void)setImageFromDocumentDirWithName:(NSString *)strImageName setImageToView:(UIImageView *)imgView imgURL:(NSURL *)url forIndexPath:(NSIndexPath *)indexPath
并用 -
替换它的定义-(void)setImageFromDocumentDirWithName:(NSString *)strImageName setImageToView:(UIImageView *)imgView imgURL:(NSURL *)url forIndexPath:(NSIndexPath *)indexPath{
UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
if(cell ! =nil)
{
UIImageView *imageView = [cell viewWithTag:100];
NSString *workSpacePath=[[Utility applicationDocumentsDirectory] stringByAppendingPathComponent:strImageName];
BOOL fileExists=[[NSFileManager defaultManager] fileExistsAtPath:workSpacePath];
if (fileExists) {
imageView.image =[UIImage imageWithData:[NSData dataWithContentsOfFile:workSpacePath]];
}
else{
[imageView sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"Default1"]];
}
}
}