Cambiar attributes de UICollectionViewCell en didSelectItemAtIndexPath

Estoy configurando un UICollectionViewCell en una subclass, agrega 2 subvenciones a la propiedad contentView , ambos son UIImageView y ambos tienen la propiedad hidden establecida en YES . Estas subvistas son imágenes "marcadas" y "no marcadas" que superponen el UIImageView primario en la celda para indicar si se selecciona o no la celda actual utilizando la function de "selección múltiple" de UICollectionView.

Cuando se collectionView:didSelectItemAtIndexPath: la celda, se llama a collectionView:didSelectItemAtIndexPath: se llama al delegado, y me gustaría setHidden:NO en el UIImageView "marcado". Llamar a esto en la celda no hace nada en absoluto: la celda aparentemente está bloqueada en su estado original dibujado.

¿Es posible realizar cambios en una celda fuera de collectionView:cellForItemAtIndexPath: 😕 He intentado agregar manualmente subvistas dentro de collectionView:didSelectItemAtIndexPath: pero no hace absolutamente ningún cambio en la interfaz de usuario. He verificado que se está llamando al método de delegado, no hace cambios en mi celda.

 - (void) collectionView(UICollectionView *)cv didSelectItemAtIndexPath(NSIndexPath *)indexPath { ShotCell *cell = [self collectionView:cv cellForItemAtIndexPath:indexPath]; UILabel *testLabel = UILabel.alloc.init; testLabel.text = @"FooBar"; testLabel.sizeToFit; [cell.contentView.addSubview testLabel]; } 

He publicado un proyecto de ejemplo para ti que demuestra a) agregar una subvista al contenido de una celda yb) modificar esa subvista en didSelectItemAtIndexPath.

La forma en que intentas hacer esto es incorrecta. Debe mantener una reference a la celda o celdas seleccionadas en una propiedad. En este ejemplo, utilizo una matriz para mantener las routes de índice de las celdas seleccionadas y, a continuación, compruebo si la ruta del índice que pasó a cellForItemAtIndexPath está contenida en esa matriz. Deselecciono la celda si hace clic en una que ya está seleccionada:

 @interface ViewController () @property (strong,nonatomic) NSArray *theData; @property (strong,nonatomic) NSMutableArray *paths; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.paths = [NSMutableArray new]; self.theData = @[@"One",@"Two",@"Three",@"Four",@"Five",@"Six",@"Seven",@"Eight"]; [self.collectionView registerNib:[UINib nibWithNibName:@"CVCell" bundle:nil] forCellWithReuseIdentifier:@"cvCell"]; UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init]; [flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical]; [self.collectionView setCollectionViewLayout:flowLayout]; } -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return self.theData.count; } -(CVCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"cvCell"; CVCell *cell = (CVCell *) [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; cell.backgroundColor = [UIColor whiteColor]; cell.label.text = self.theData[indexPath.row]; if ([self.paths containsObject:indexPath]) { [cell.iv setHidden:NO]; // iv is an IBOutlet to an image view in the custom cell }else{ [cell.iv setHidden:YES]; } return cell; } -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { if ([self.paths containsObject:indexPath]) { [self.paths removeObject:indexPath]; }else{ [self.paths addObject:indexPath]; } [self.collectionView reloadItemsAtIndexPaths:@[indexPath]]; } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { return CGSizeMake(150, 150); }