UIButton all'interno di UITableViewController
-
08-07-2019 - |
Domanda
Ho un UIButton
che viene creato all'interno di ogni cella della tabella. Voglio collegare un evento touch in questo modo:
[imageButton addTarget:self
action:@selector(startVote:)
forControlEvents:UIControlEventTouchUpInside];
Voglio passare i dati sulla riga corrente (l'id dell'oggetto per quella riga) al metodo startVote. C'è un metodo che mi manca per farlo o sto infrangendo alcune buone pratiche. Sembra una cosa molto normale da fare?
Soluzione
Presumo che tu abbia una sorta di NSArray
con i dati che vengono passati ai pulsanti in cellForRowAtIndexPath
.
Prova questo in startVote
:
- (void)startVote:(id)sender {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
NSDictionary *myData = [myArray objectAtIndex:indexPath.row];
}
EDIT:
Se per qualche motivo la riga non è selezionata, puoi assegnare un tag
univoco a ogni pulsante al momento della creazione e quindi:
- (void)startVote:(id)sender {
int myTag = [(UIButton *)sender tag];
NSDictionary *myData = [myArray objectAtIndex:myTag];
}
Forse potresti fare una sorta di operazione con il tag
in modo che possa essere usato come indice (aggiungo un certo importo a ogni tag
in modo che non sia in conflitto con la codifica "automatica" utilizzata dal sistema operativo.
Altri suggerimenti
Il UITableViewCell
non sa, per impostazione predefinita, quale riga viene visualizzata nella tabella. Ricorda, l'intento è che le stesse istanze di cella vengano riutilizzate in tutta la tabella per visualizzare i suoi dati. Detto questo, il tuo UITableViewController
è responsabile della configurazione delle celle e del loro passaggio al sistema (e ovviamente ha il percorso dell'indice). A quel punto, potresti fare qualcosa del genere:
- Supponendo che sia una classe di cella personalizzata, imposta una proprietà sull'istanza di cella per identificare quale riga viene visualizzata e quale pulsante può utilizzare in seguito.
- Se stai inserendo questi pulsanti nelle celle come viste accessorie, dai un'occhiata al delegato della tabella
tableView: accessorioButtonTappedForRow>. >
- Se si tratta di una tabella a sezione unica, potresti fare qualcosa di veramente banale come memorizzare l'indice di riga nella proprietà
tag
del pulsante. Al metodostartVote:
viene passato il pulsante e quindi è possibile estrarne il tag. - Se si tratta di una tabella a sezione unica, potresti fare qualcosa di veramente banale come memorizzare l'indice di riga nella proprietà