respuesta de Jay es grande, pero si tiene varias secciones que no funcionará ya que el indexRow es local to a section.
Otro método, si está utilizando botones en un TableView que tiene varias secciones, es pasar los eventos táctiles.
Cuando se declara el botón dentro de un cargador perezoso:
- (UIButton *)awesomeButton
{
if(_awesomeButton == nil)
{
_awesomeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[_awesomeButton addTarget:self.drugViewController action:@selector(buttonPressed:event:) forControlEvents:UIControlEventTouchUpInside];
}
return _awesomeButton;
}
La clave aquí es que la cadena de eventos sobre el método de selección. No puede pasar sus propios parámetros, pero puede pasar los eventos.
La función del botón se engancha a:
- (void)buttonPressed:(id)sender event:(id)event
{
NSSet *touches = [event allTouches];
UITouch *touch = [touches anyObject];
CGPoint currentTouchPosition = [touch locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition];
NSLog(@"Button %d was pressed in section %d",indexPath.row, indexPath.section);
}
La clave aquí es la función indexPathForRowAtPoint
. Esta es una función ingeniosa en UITableView
que le dará el indexPath en cualquier punto. También es importante la función locationInView
porque necesita el toque en el contexto de tableView para que pueda identificar el indexPath específico.
Esto le permitirá saber qué botón era, en una tabla con varias secciones.
No es necesario que use IBAction. Ver otras respuestas –