Os delegados são o caminho a percorrer.
Como visto em outras respostas, o uso de visualizações pode ficar desatualizado. Quem sabe amanhã pode haver outro invólucro e talvez precise usar cell superview]superview]superview]superview]
. E se você usar tags, você terá um número n de condições senão para identificar a célula. Para evitar tudo isso, configure os delegados. (Ao fazer isso, você criará uma classe de célula reutilizável. Você pode usar a mesma classe de célula que uma classe base e tudo que você precisa fazer é implementar os métodos de delegação.)
Primeiro, precisamos de uma interface (protocolo) que será usada pela célula para comunicar (delegar) cliques no botão. ( Você pode criar um arquivo .h separado para o protocolo e incluir no controlador de exibição de tabela e nas classes de células personalizadas OU basta adicioná-lo na classe de célula personalizada, que será incluída no controlador de exibição de tabela )
@protocol CellDelegate <NSObject>
- (void)didClickOnCellAtIndex:(NSInteger)cellIndex withData:(id)data;
@end
Inclua esse protocolo no controlador de exibição de célula e tabela personalizado. E verifique se o controlador de exibição de tabela confirma este protocolo.
Na célula personalizada, crie duas propriedades:
@property (weak, nonatomic) id<CellDelegate>delegate;
@property (assign, nonatomic) NSInteger cellIndex;
No UIButton
delegado IBAction, clique em: (O mesmo pode ser feito para qualquer ação na classe de célula personalizada que precise ser delegada novamente para visualizar o controlador )
- (IBAction)buttonClicked:(UIButton *)sender {
if (self.delegate && [self.delegate respondsToSelector:@selector(didClickOnCellAtIndex:withData:)]) {
[self.delegate didClickOnCellAtIndex:_cellIndex withData:@"any other cell data/property"];
}
}
No controlador de exibição de tabela cellForRowAtIndexPath
após remover a fila da célula, defina as propriedades acima.
cell.delegate = self;
cell.cellIndex = indexPath.row; // Set indexpath if its a grouped table.
E implemente o delegado no controlador de exibição de tabela:
- (void)didClickOnCellAtIndex:(NSInteger)cellIndex withData:(id)data
{
// Do additional actions as required.
NSLog(@"Cell at Index: %d clicked.\n Data received : %@", cellIndex, data);
}
Essa seria a abordagem ideal para obter ações personalizadas de botão de célula no controlador de exibição de tabela.