I delegati sono la strada da percorrere.
Come visto con altre risposte, l'utilizzo delle viste potrebbe non essere aggiornato. Chissà domani potrebbe esserci un altro wrapper e potrebbe essere necessario utilizzarlo cell superview]superview]superview]superview]
. E se usi i tag, finiresti con n numero di if if condizioni per identificare la cella. Per evitare tutto ciò, impostare delegati. (In questo modo creerai una classe di celle riutilizzabile. Puoi usare la stessa classe di celle di una classe di base e tutto ciò che devi fare è implementare i metodi delegati.)
Per prima cosa abbiamo bisogno di un'interfaccia (protocollo) che verrà utilizzata dalla cella per comunicare (delegare) i clic sui pulsanti. ( È possibile creare un file .h separato per il protocollo e includerlo sia nel controller della vista tabella sia nelle classi di celle personalizzate O semplicemente aggiungerlo nella classe di celle personalizzata che verrà comunque inclusa nel controller di vista tabella )
@protocol CellDelegate <NSObject>
- (void)didClickOnCellAtIndex:(NSInteger)cellIndex withData:(id)data;
@end
Includere questo protocollo nel controller di visualizzazione cella e tabella personalizzato. E assicurati che il controller della vista tabella confermi questo protocollo.
Nella cella personalizzata creare due proprietà:
@property (weak, nonatomic) id<CellDelegate>delegate;
@property (assign, nonatomic) NSInteger cellIndex;
Nel UIButton
clic del delegato IBAction: ( Lo stesso può essere fatto per qualsiasi azione nella classe di celle personalizzata che deve essere delegata per visualizzare il controller )
- (IBAction)buttonClicked:(UIButton *)sender {
if (self.delegate && [self.delegate respondsToSelector:@selector(didClickOnCellAtIndex:withData:)]) {
[self.delegate didClickOnCellAtIndex:_cellIndex withData:@"any other cell data/property"];
}
}
Nel controller della vista tabella cellForRowAtIndexPath
dopo aver rimosso la cella dalla cella, impostare le proprietà sopra.
cell.delegate = self;
cell.cellIndex = indexPath.row; // Set indexpath if its a grouped table.
E implementare il delegato nel controller di visualizzazione tabella:
- (void)didClickOnCellAtIndex:(NSInteger)cellIndex withData:(id)data
{
// Do additional actions as required.
NSLog(@"Cell at Index: %d clicked.\n Data received : %@", cellIndex, data);
}
Questo sarebbe l'approccio ideale per ottenere azioni personalizzate dei pulsanti delle celle nel controller della vista tabella.