Obtener clic en el botón dentro de UITableViewCell

Resuelto ankit_rck asked hace 54 años • 18 respuestas

Tengo un controlador de vista con una vista de tabla y una punta separada para la plantilla de celda de la tabla. La plantilla de celda tiene algunos botones. Quiero acceder al clic del botón junto con el índice de la celda en la que se hizo clic dentro del controlador de vista donde definí la vista de tabla.

Entonces tengo ViewController.hy ViewController.mdonde tengo el UITableViewy TableTemplate.h, TableTemplate.my TableTemplate.xibdonde tengo la punta definida. Quiero el evento de clic de botón con índice de celda en formato ViewController.m.

¿Alguna ayuda sobre cómo puedo hacer eso?

ankit_rck avatar Jan 01 '70 08:01 ankit_rck
Aceptado

1) En su cellForRowAtIndexPath:método, asigne la etiqueta del botón como índice:

cell.yourbutton.tag = indexPath.row;

2) Agregue objetivo y acción para su botón como se muestra a continuación:

[cell.yourbutton addTarget:self action:@selector(yourButtonClicked:) forControlEvents:UIControlEventTouchUpInside];

3) Codifique acciones basadas en el índice como se muestra a continuación en ViewControler:

-(void)yourButtonClicked:(UIButton*)sender
{
     if (sender.tag == 0) 
     {
         // Your code here
     }
}

Actualizaciones para múltiples secciones:

Puede consultar este enlace para detectar clics en el botón en la vista de tabla para varias filas y secciones.

Mani avatar Dec 18 '2013 10:12 Mani

Los delegados son el camino a seguir.

Como se vio con otras respuestas, el uso de vistas puede quedar obsoleto. Quién sabe mañana podría haber otro envoltorio y tal vez sea necesario usarlo cell superview]superview]superview]superview]. Y si usa etiquetas, terminaría con n número de condiciones if else para identificar la celda. Para evitar todo eso, configure delegados. (Al hacerlo, creará una clase de celda reutilizable. Puede usar la misma clase de celda como clase base y todo lo que tiene que hacer es implementar los métodos delegados).

Primero necesitamos una interfaz (protocolo) que será utilizada por el celular para comunicar (delegar) los clics en los botones. ( Puede crear un archivo .h separado para el protocolo e incluirlo tanto en el controlador de vista de tabla como en las clases de celda personalizadas O simplemente agregarlo en una clase de celda personalizada que de todos modos se incluirá en el controlador de vista de tabla )

@protocol CellDelegate <NSObject>
- (void)didClickOnCellAtIndex:(NSInteger)cellIndex withData:(id)data;
@end

Incluya este protocolo en el controlador de vista de tabla y celda personalizado. Y asegúrese de que el controlador de vista de tabla confirme este protocolo.

En la celda personalizada cree dos propiedades:

@property (weak, nonatomic) id<CellDelegate>delegate;
@property (assign, nonatomic) NSInteger cellIndex;

En UIButtonIBAction, haga clic en delegado: ( Se puede hacer lo mismo para cualquier acción en una clase de celda personalizada que deba delegarse nuevamente al controlador de vista )

- (IBAction)buttonClicked:(UIButton *)sender {
    if (self.delegate && [self.delegate respondsToSelector:@selector(didClickOnCellAtIndex:withData:)]) {
        [self.delegate didClickOnCellAtIndex:_cellIndex withData:@"any other cell data/property"];
    }
}

En el controlador de vista de tabla cellForRowAtIndexPath, después de quitar la celda, establezca las propiedades anteriores.

cell.delegate = self;
cell.cellIndex = indexPath.row; // Set indexpath if its a grouped table.

E implemente el delegado en el controlador de vista de tabla:

- (void)didClickOnCellAtIndex:(NSInteger)cellIndex withData:(id)data
{
    // Do additional actions as required.
    NSLog(@"Cell at Index: %d clicked.\n Data received : %@", cellIndex, data);
}

Este sería el enfoque ideal para obtener acciones personalizadas de botones de celda en el controlador de vista de tabla.

GoodSp33d avatar Jul 13 '2014 08:07 GoodSp33d