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?

È stato utile?

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:

scroll top