No se puede deseleccionar UICollectionView Cell una vez que se vuelve a cargar

He tenido una serie de problemas con UIcollectionView y creo que la solución es lo que actualmente está causando el problema.

De acuerdo, entonces tengo una vista de colección que carga objects de una class que se actualiza con mucha frecuencia, tal vez cada pocos segundos.

El primer problema con el que me encontré; fue que cuando seleccioné una celda y la resalté, otra celda más abajo en la vista de la colección también se destacó. Mi solución fue crear una matriz de celdas seleccionadas y ejecutar un ciclo a través de la nueva matriz para decidir qué resaltar.

Ahora, el problema surge cuando la colecciónview se vuelve a cargar. Las celdas siguen permaneciendo resaltadas y aparecen seleccionadas, pero no tienen loggings, por lo que no puedo anular la selección.

- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection: (NSInteger)section { return [self.deviceList count]; } - (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView { return 1; } - (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { DeviceCollectionViewCell *cell = [self.deviceCollectionView dequeueReusableCellWithReuseIdentifier:@"DeviceCell" forIndexPath:indexPath]; if([self.deviceList count] > indexPath.row) { cell.device = [self.deviceList objectAtIndex:indexPath.row]; } if ([[self.deviceCollectionView indexPathsForSelectedItems] containsObject:indexPath]) { NSLog(@"does it ever?"); // cell.backgroundColor = [UIColor blueColor]; } for (TDDeviceParser *device in self.selectedDevices) { if ([cell.device.deviceTextRecord.serialNumber isEqualToString:device.deviceTextRecord.serialNumber]) { [cell setSelected:YES]; break; } else { [cell setSelected:NO]; } } return cell; } - (UICollectionReusableView *)collectionView: (UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *reusableview = nil; if (kind == UICollectionElementKindSectionHeader) { TitleHeaderForDeviceCollectionView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath]; reusableview = headerView; } else if (kind == UICollectionElementKindSectionFooter) { LogoFooterForDeviceCollectionView *footerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"FooterView" forIndexPath:indexPath]; reusableview = footerView; } return reusableview; } #pragma mark - UICollectionViewDelegate - (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath { //Iphone Five and Older Ipads: Max2 int maxCount = 2; //ipad 4 if ([[UIDeviceHardwareVersion platform] isEqualToString:@"iPad3,4"] || [[UIDeviceHardwareVersion platform] isEqualToString:@"iPad3,5"] || [[UIDeviceHardwareVersion platform] isEqualToString:@"iPad3,6"]) { maxCount = 4; } //Ipod5th,Iphone4 & Iphone4s; Don't select, just play. else if ([[UIDeviceHardwareVersion platform] isEqualToString:@"iPod5,1"] || [[UIDeviceHardwareVersion platform] isEqualToString:@"iPhone4,1"] || [[UIDeviceHardwareVersion platform] isEqualToString:@"iPhone3,1"] || [[UIDeviceHardwareVersion platform] isEqualToString:@"iPhone3,2"] || [[UIDeviceHardwareVersion platform] isEqualToString:@"iPhone3,3"]) { maxCount = 0; //Just play. [self.selectedDevices removeAllObjects]; [self.selectedDevices addObject:[self.deviceList objectAtIndex:indexPath.row]]; [[TDDeviceManager shanetworkingInstance] removeObserver:self]; [self performSegueWithIdentifier:@"VideoPlayer" sender:self]; } if (self.selectedDevices.count < maxCount) { return YES; } else { return NO; } } - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { [self.selectedDevices addObject:[self.deviceList objectAtIndex:indexPath.row]]; [self updatePlayerImages]; NSLog(@"device Count %d",self.selectedDevices.count); } - (BOOL)collectionView:(UICollectionView *)collectionView shouldDeselectItemAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"Should I Deselect?"); return YES; } - (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"%s",__PRETTY_FUNCTION__); //What device do we remove? for (TDDeviceParser *device in self.selectedDevices) { if ([device.deviceTextRecord.serialNumber isEqualToString:((TDDeviceParser*)[self.deviceList objectAtIndex:indexPath.row]).deviceTextRecord.serialNumber]) { NSLog(@"%s Removed %@",__PRETTY_FUNCTION__, device.name); [self.selectedDevices removeObject:device]; break; } } NSLog(@"%s Update %d",__PRETTY_FUNCTION__, self.selectedDevices.count); [self updatePlayerImages]; } 

Creo que el problema es que se seleccionó la celda pero CollectionView no sabía que la celda estaba seleccionada. Agregué (The Second Line) para solucionar el problema.

  [cell setSelected:YES]; [self.deviceCollectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone];