2015-04-10 5 views
0

Я пытаюсь интегрировать UICollectionView с несколькими изображениями. Я извлекаю изображения из API динамически и загружаю их непосредственно в UICollectionViewCell с помощью библиотеки 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

Do у вас есть исходный код, где вы устанавливаете содержимое ячейки? У меня была проблема, похожая на вас. Я не уверен, что это ваш случай, но когда вы просматриваете таблицу или коллекцию, iOS пытается повторно использовать ячейки с тем же типом. Итак, если вы загрузили предыдущее изображение в существующую ячейку, новое изображение, которое вы загружаете для показа в «новой» ячейке, не будет отображаться до тех пор, пока вы его не загрузите. Итак, старый будет до этого. – EnriMR

+0

UIImageView * imgSpace = (UIImageView *) [myCell viewWithTag: 100]; [self setImageFromDocumentDirWithName: [[arrAddSpace objectAtIndex: indexPath.row] objectForKey: @ "thumbnail_url"] setImageToView: imgSpace imgURL: url]; –

+0

Я передаю imgview, на котором я хочу показать это изображение как параметр метода setImageFromDocumentDirWithName. –

ответ

0

Это вопрос, который связан с повторным использованием ячейки & также настройки изображения к неправильному ячейке.

В UICollectionView или UITableView для достижения максимальной производительности и снижения потребления памяти используется концепция многоразовых ячеек. Основная концепция заключается в том, что представление коллекции и представление таблицы первоначально создают только видимые ячейки, и когда мы прокручиваем уже созданные ячейки, они повторно используются с требованием обновить подзоны (контейнеры) ячеек содержимым соответствующего пути (ячейки) индекса, ,

В вашем случае, когда вы создаете представление коллекции, изображения для ячеек будут отображаться правильно, пока вы не прокрутите список. Но как только вы прокручиваете ячейки, они повторно используются, и изображения, предназначенные для отображения в ячейке, не отображаются там.

Чтобы преодолеть эту проблему, вам необходимо обновить изображение ячейки на основе данных для пути индекса к ячейке одного и того же пути индекса.

Также, если вам нужно знать точную проблему в коде, пожалуйста, отправьте источник создания ячейки и установите изображение в ячейку.

+0

Я отредактировал свой вопрос, пожалуйста, проверьте, не ошибаюсь ли я с настройкой ячейки –

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"]]; 
    } 
} 
} 
+0

Это всегда возвращает ячейку nil –

+0

, вы также вызвали метод, передающий путь индекса - [self setImageFromDocumentDirWithName: [[arrAddSpace objectAtIndex: indexPath.row] objectForKey: @ "thumbnail_url"] setImageToView: imgSpace imgURL: url forIndexPath: indexPath]; –

Смежные вопросы