Delegaci są do zrobienia.
Jak widać w przypadku innych odpowiedzi, korzystanie z widoków może być nieaktualne. Kto wie, że jutro może być inne opakowanie i być może trzeba będzie go użyć cell superview]superview]superview]superview]
. A jeśli użyjesz tagów, otrzymasz n liczbę warunków if else do identyfikacji komórki. Aby uniknąć tego wszystkiego, ustaw delegatów. (W ten sposób utworzysz klasę komórek wielokrotnego użytku. Możesz użyć tej samej klasy komórki jako klasy bazowej, a wszystko, co musisz zrobić, to zaimplementować metody delegatów.)
Najpierw potrzebujemy interfejsu (protokołu), który będzie używany przez komórkę do komunikowania (delegata) kliknięć przycisków. ( Możesz utworzyć oddzielny plik .h dla protokołu i dołączyć go zarówno do kontrolera widoku tabeli, jak i niestandardowych klas komórek LUB po prostu dodaj go do niestandardowej klasy komórki, która i tak zostanie uwzględniona w kontrolerze widoku tabeli )
@protocol CellDelegate <NSObject>
- (void)didClickOnCellAtIndex:(NSInteger)cellIndex withData:(id)data;
@end
Dołącz ten protokół do niestandardowego kontrolera widoku komórki i tabeli. I upewnij się, że kontroler widoku tabeli potwierdza ten protokół.
W komórce niestandardowej utwórz dwie właściwości:
@property (weak, nonatomic) id<CellDelegate>delegate;
@property (assign, nonatomic) NSInteger cellIndex;
W funkcji UIButton
delegata IBAction kliknij: (To samo można zrobić dla dowolnej akcji w niestandardowej klasie komórki, która musi zostać oddelegowana z powrotem do kontrolera widoku )
- (IBAction)buttonClicked:(UIButton *)sender {
if (self.delegate && [self.delegate respondsToSelector:@selector(didClickOnCellAtIndex:withData:)]) {
[self.delegate didClickOnCellAtIndex:_cellIndex withData:@"any other cell data/property"];
}
}
W kontrolerze widoku tabeli cellForRowAtIndexPath
po usunięciu z kolejki komórki ustaw powyższe właściwości.
cell.delegate = self;
cell.cellIndex = indexPath.row; // Set indexpath if its a grouped table.
I zaimplementuj delegata w kontrolerze widoku tabeli:
- (void)didClickOnCellAtIndex:(NSInteger)cellIndex withData:(id)data
{
// Do additional actions as required.
NSLog(@"Cell at Index: %d clicked.\n Data received : %@", cellIndex, data);
}
Byłoby to idealne podejście do uzyskania niestandardowych akcji przycisków komórki w kontrolerze widoku tabeli.