Los delegados son el camino a seguir.
Como se ve con otras respuestas, el uso de vistas puede quedar desactualizado. Quién sabe mañana, podría haber otro contenedor y tal vez deba usarlo cell superview]superview]superview]superview]
. Y si usa etiquetas, terminaría con n número de condiciones si no 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 que una clase base y todo lo que tiene que hacer es implementar los métodos de delegado).
Primero necesitamos una interfaz (protocolo) que será utilizada por la célula para comunicar (delegar) los clics de 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 la 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 el UIButton
delegado de IBAction, haga clic en: ( Se puede hacer lo mismo para cualquier acción en la clase de celda personalizada que deba delegarse nuevamente para ver el controlador )
- (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 botón de celda en el controlador de vista de tabla.