Los botones seleccionados UITableViewCell cambian a estado no seleccionado al desplazarse por UITableView

La acción del button es SongsSelectionSongs_Click . Cuando hago clic en este button, la image del button cambia, el recuento de UITableView del button se vuelve correcto y después de que las imágenes de los botones seleccionados también cambian, pero cuando me UITableView hacia delante y hacia atrás en UITableView la image del button parece cambiar random.

introduzca la descripción de la imagen aquí

Este es mi código:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"SongsTAbleViewCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if(cell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SongsTAbleViewCell" owner:self options:nil]; cell = [nib objectAtIndex:0]; } btn_songSelect.tag = indexPath.row; lbl_songLabel.text = [[arr_tablVArray objectAtIndex:indexPath.row] objectForKey:@"SongTitle"]; lbl_artistLabel.text = [[arr_tablVArray objectAtIndex:indexPath.row] objectForKey:@"SongArtist"]; return cell; } -(IBAction)SongsSelectionSongs_Click:(id)sender { UIButton *button = sender; CGPoint correctedPoint = [button convertPoint:button.bounds.origin toView:self.tblv_SongslisttableView]; NSIndexPath *indexPath = [self.tblv_SongslisttableView indexPathForRowAtPoint:correctedPoint]; NSLog(@"Button tapped in row %d",indexPath.row); SelectedAlbumUrl = [[arr_tablVArray objectAtIndex:indexPath.row] objectForKey:@"SongUrl"]; str_songtitle = [[arr_tablVArray objectAtIndex:indexPath.row] objectForKey:@"SongTitle"]; if ([[button backgroundImageForState:UIControlStateNormal] isEqual:[UIImage imageNamed:@"add.png"]]) { btn_songsShareButton.userInteractionEnabled = YES; [btn_songSelect setBackgroundImage:[UIImage imageNamed:@"remove.png"] forState:UIControlStateNormal]; buttonStatus = buttonStatus +1; [btn_songsShareButton setImage:[UIImage imageNamed:@"share selected.png"] forState:UIControlStateNormal]; } else { [btn_songSelect setBackgroundImage:[UIImage imageNamed:@"add.png"] forState:UIControlStateNormal]; buttonStatus = 1; [btn_songsShareButton setImage:[UIImage imageNamed:@"share unselected.png"] forState:UIControlStateNormal]; } } 

// Inténtalo, está funcionando bien

file pragma .h

 NSMutableArray * rowIdArray; 

Archivo pragma .M

 @synthesize rowIdArray; - (void)viewDidLoad { rowIdArray=[[NSMutableArray alloc]init]; } -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [NamesArray count]; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; ViewControllerCell *cell = (ViewControllerCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if(cell == nil) { NSArray *nib; nib = [[NSBundle mainBundle] loadNibNamed:@"ViewControllerCell" owner:self options:nil]; cell = [nib objectAtIndex:0]; } // Configure the cell... cell.nameslbl.text = [NamesArray objectAtIndex:indexPath.row]; cell.nameBtn.tag=indexPath.row; [cell.nameBtn addTarget:self action:@selector(NamesClick_Tapped:) forControlEvents:UIControlEventTouchUpInside]; NSString *a=[NSString stringWithFormat:@"%d", indexPath.row]; NSString *b=[[NSString alloc]init]; for (int i=0;i<[rowIdArray count];i++) { b=[rowIdArray objectAtIndex:i]; if ([a isEqualToString:b]) { UIImage *buttonImage = [UIImage imageNamed:@"star_selected.png"]; [cell.nameBtn setBackgroundImage:buttonImage forState:UIControlStateNormal]; } } return cell; } -(IBAction)NamesClick_Tapped:(id)sender { CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.NameTableView]; NSIndexPath *indexPath = [self.NameTableView indexPathForRowAtPoint:buttonPosition]; NSString *rowIdStr = [NSString stringWithFormat:@"%d", indexPath.row]; if(![rowIdArray containsObject:rowIdStr]) { [rowIdArray addObject:rowIdStr]; }else{ [rowIdArray removeObject: rowIdStr]; } [self.NameTableView reloadData]; } 

No está haciendo nada dentro de su cellForRowAtIndexPath para seleccionar o anular la selección de la image. Cuando reutiliza una celda, no cambia el estado de la celda a less que explícitamente lo cellForRow en cellForRow . Por lo tanto, reutilizará una celda seleccionada o no seleccionada (sea la primera celda reutilizable disponible) y la colocará en la pantalla tal como está.

Para solucionar este problema, necesita lógica en su método cellForRowAtIndexPath para seleccionar o anular la selección de la image según lo que sea apropiado.


En general, si su problema tiene algo que ver con "mis células no aparecen correctamente cuando se desplaza", las probabilidades son de que no está reutilizando sus células correctamente.

EDITAR: en respuesta a su comentario, no , no volveré a escribir su código. Pero te daré alguna dirección.

Recomendaría mantener una key / valor adicional en su arr_tablVArray que rastreará si el "compartir" debería habilitarse o deshabilitarse (sugeriría un valor bool ). Esto lo haría para que pueda comprobar si el "compartir" está habilitado / deshabilitado mediante la comprobación de un bool lugar de verificar el contenido de la image del button en su método IBAction .

Esta información ahora también estará disponible en su método cellForRowAtIndexPath , y podría verificar el valor del logging actual en arr_tablVArray y configurar sus imágenes de acuerdo al mismo modo que configuró su lbl_songLabel y lbl_artistLabel .

cuando reutiliza una celda donde ya se ha establecido el button, aparece el mismo button con la image configurada previamente. En lugar de crear un nuevo button cada vez que necesite una celda, simplemente debe restablecer el estado de un button existente. Este enlace puede ayudarlo.