2015-02-09 1 views
1

У меня есть uicollectionview, которое загружается на основе результатов abarbar в предыдущем uiviewcontroller. В ячейках коллекции я загружаю изображения из Интернета. Когда collectionView: (UICollectionView *) cv cellForItemAtIndexPath: называется Я помещаю местозаполнитель на изображение ячейки и начинаю загрузку изображения из Интернета. Когда загрузка выполняется, я перезаряжаю ячейку, чтобы окончательное изображение было правильно установлено. Таким образом, метод вызывается дважды для каждой ячейки.UICollectionView, показывающий значения из старых ячеек при повторном использовании

Это часть кода, которая может представлять интерес: - (TXCeldaPOICollection *) CollectionView: (UICollectionView *) резюме cellForItemAtIndexPath: (NSIndexPath *) indexPath {

TXCeldaPOICollection *cell = [cv dequeueReusableCellWithReuseIdentifier:@"CeldaPOI" forIndexPath:indexPath]; 
... 
     NSNumber *estaDisponible=[disponibles objectAtIndex:indexPath.row]; 
    if ([estaDisponible boolValue]==YES) { 
     cell.imgCelda.image=[imagenes objectAtIndex:indexPath.row]; 
     NSLog(@"Imagen disponible en la celda numero numero %ld",(long)indexPath.row); 
    } else { 
     cell.imgCelda.image=[UIImage imageNamed:@"placeholder.png"]; 
     NSLog(@"Placeholder colocado en la celda numero numero %ld",(long)indexPath.row); 
     // Monto la URL de descarga: 
     NSString *urlDescarga=kBaseURL; 

     urlDescarga=[urlDescarga stringByAppendingString:[[self.listaCeldas objectAtIndex:indexPath.row] valueForKey:@"foto1"]]; 
     NSURL *direccion=[NSURL URLWithString:urlDescarga]; 
     [self downloadImageWithURL:direccion conOrden:self.estadioFiltrado completionBlock:^(BOOL succeeded, UIImage *image, NSInteger ordenacion) { 
      if (succeeded) { 

       NSLog(@"Imagen descargada estadio %ld orden %ld indice %ld poi %[email protected]",self.estadioFiltrado, ordenacion, indexPath.row, [seleccionado.identificador integerValue]); 

       if (ordenacion==self.estadioFiltrado) { 
        if (image!=nil) { 
         //Meto comprobacion de no rebase del array aunque genere algun error me protejo frente a cueelgues 
         NSInteger numeroImagenes= imagenes.count; 
         if (indexPath.row<=numeroImagenes-1) { 

          [imagenes replaceObjectAtIndex:indexPath.row withObject:image]; 
          [disponibles replaceObjectAtIndex:indexPath.row withObject:[NSNumber numberWithBool:YES]]; 
          NSArray *recargar=[[NSArray alloc] initWithObjects:indexPath, nil]; 
          NSLog(@"Imagen DESCARGADA numero %ld y llamando a recargar ccelda",(long)indexPath.row); 
          [self.coleccion reloadItemsAtIndexPaths:recargar]; 
         } 
        } 
       } 

      } else { 

      } 
     }]; 


    } 
} 

Странным приходит в настоящее время , Когда я сначала загружаю viewview для определенного поиска в предыдущей строке поиска, поведение является ожидаемым. Каждая ячейка вызывается дважды, и я могу увидеть в течение короткого времени местозаполнитель в ячейках, а затем появятся разные изображения. Так что все в порядке.

Но, если я вернусь к строке поиска -popViewController из той, которая отображается в коллекции, что-то странное происходит, если я снова загружаю один и тот же просмотр коллекции - тот же результат выбранной строки поиска. Сначала я вижу старые ячейки - я знаю, что они старые, потому что метод для новых не называется - тогда я вижу местозаполнитель и в конечном итоге окончательное изображение, которое бывает таким же, как в старых ячейках, но эффект не хорошо, потому что вы видите: image-placeholder-image.

Вещь - метод taht для определения ячеек вызывается только дважды для каждой ячейки, как и должно быть, но отображается начальное содержимое ячейки.

Я прочитал несколько подобных вопросов, и я пробовал два подхода без succcess: - Я применил метод Prepareforreuse в своем классе ячеек. - Я использовал - (void) collectionView: (UICollectionView *) cv didEndDisplayingCell: (UICollectionViewCell *) cell forItemAtIndexPath: (NSIndexPath *) метод indexPath.

Как я уже сказал, никакого результата. Любая другая идея? Я с этим вопросом уже два дня, и я действительно очень отчаянный.

+0

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

+0

Панель поиска находится в бывшем uiviewcontroller, результаты поиска представлены в таблице и при выборе одного из них я нажимаю новый контроллер, где я показываю коллекцию, поэтому на самом деле я всегда перезагружаю коллекцию после поиска, так как я загружаю новый uiviewcontroller – user3188554

+0

, вы попытались разместить точку останова, чтобы увидеть, что метод dequeue на самом деле называется когда вы вернетесь к результату поиска? – YuviGr

ответ

0

Для этого условия, как правило, есть две проблемы, которые могут быть проблемой: обращение с деинтервью или обработка источника данных.

Похоже, что ваш код уже хорошо обрабатывает процесс дезактивации, помещая if else для изображения, где, если изображение загружено, установите изображение, иначе задайте образ заполнителя.

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