Problema UITableView indexPath.row

Estoy usando una tableView que carga un UITableViewCell personalizado con un button "Tap" dentro de él. Se llama a un método cuando el usuario hace clic en el button.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {... [btnRowTap addTarget:self action:@selector(didButtonTouchUpInside:) forControlEvents:UIControlEventTouchDown]; ... return cell; } 

En el método didButtonTouchUpInside, estoy tratando de recuperar el valor de la fila seleccionada de la siguiente manera:

 -(IBAction)didButtonTouchUpInside:(id)sender{ UIButton *btn = (UIButton *) sender; UITableViewCell *cell = (UITableViewCell *)btn.superview; NSIndexPath *indexPath = [matchingCustTable indexPathForCell:cell]; NSLog(@"%d",indexPath.row); } 

El problema es que onclick en cualquier fila, obtengo el mismo valor de 0 cada vez. Donde estoy yendo mal

No debe confiar en la jerarquía de vista de un UITableViewCell. Este enfoque fallará en iOS7, ya que iOS7 cambia la jerarquía de la vista de la celda. Habrá una vista adicional entre su button y UITableViewCell.

Hay mejores forms de manejar esto.

  1. Convierta el marco del button para que sea relativo a la vista de tabla
  2. Pida a la tablaView la ruta de índice en el origen del nuevo marco.

.

 -(IBAction)didButtonTouchUpInside:(id)sender{ UIButton *btn = (UIButton *) sender; CGRect buttonFrameInTableView = [btn convertRect:btn.bounds toView:matchingCustTable]; NSIndexPath *indexPath = [matchingCustTable indexPathForRowAtPoint:buttonFrameInTableView.origin]; NSLog(@"%d",indexPath.row); } 

establecer la label del button en el método cellForRowAtIndexPath Befor configurar el método como

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {... btnRowTap.tag=indexPath.row [btnRowTap addTarget:self action:@selector(didButtonTouchUpInside:) forControlEvents:UIControlEventTouchDown]; ... return cell; } 

y tu celda tocada así: –

 -(IBAction)didButtonTouchUpInside:(id)sender{ { UIButton *button = (UIButton*)sender; NSIndexPath *indPath = [NSIndexPath indexPathForRow:button.tag inSection:0]; //Type cast it to CustomCell UITableViewCell *cell = (UITableViewCell*)[tblView1 cellForRowAtIndexPath:indPath]; NSLog(@"%d",indPath.row); } 

intente de esta manera, si agrega un button a la vista de contenido de celda, utilice el código siguiente.

  UITableViewCell *buttonCell = (UITableViewCell *)sender.superview.superview; UITableView* table1 = (UITableView *)[buttonCell superview]; NSIndexPath* pathOfTheCell = [table1 indexPathForCell:buttonCell]; int rowOfTheCell = [pathOfTheCell row]; int sectionOfTheCell = [pathOfTheCell section]; 

btn.superview es contentView de UITableviewCell . Use btn.superview.superview en btn.superview.superview lugar.

Si ya conocías el valor dentro de la celda, entonces

 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *currentCell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; if ([currentCell.textLabel.text isEqualToString:@"Your Cell Text value" ]){ //Do theStuff here } } 

Aquí está el código de su ibAction. No necesita establecer ninguna label ni nada más.

  -(IBAction)didButtonTouchUpInside:(id)sender{ NSIndexPath *indexPath = [tbl indexPathForCell:(UITableViewCell *)[[sender superview] superview]]; }