Question

J'ai un UIButton créé à l'intérieur de chaque cellule du tableau. Je souhaite connecter un événement tactile comme suit:

[imageButton addTarget:self
                action:@selector(startVote:)
      forControlEvents:UIControlEventTouchUpInside];

Je souhaite transmettre des données sur la ligne actuelle (l'id de l'objet pour cette ligne) à la méthode startVote. Y a-t-il une méthode qui me manque ou est-ce que je casse certaines bonnes pratiques? Cela semble être une chose très normale à faire?

Était-ce utile?

La solution

Je suppose que vous avez une sorte de NSArray avec les données transmises aux boutons de cellForRowAtIndexPath .

Essayez ceci dans startVote :

- (void)startVote:(id)sender {
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    NSDictionary *myData = [myArray objectAtIndex:indexPath.row];
}

EDIT:

Si, pour une raison quelconque, la ligne n'est pas sélectionnée, vous pouvez attribuer une balise unique à chaque bouton lors de la création, puis:

- (void)startVote:(id)sender {
    int myTag = [(UIButton *)sender tag];
    NSDictionary *myData = [myArray objectAtIndex:myTag];
}

Peut-être que vous feriez une sorte d'opération avec la balise afin qu'elle puisse être utilisée comme index (j'ajoute un certain montant à chaque balise afin d'éviter tout conflit avec "automatique" marquage utilisé par le système d'exploitation.

Autres conseils

Le UITableViewCell ne sait pas quelle est la ligne à afficher dans la table. N'oubliez pas que l'intention est que les mêmes instances de cellules soient réutilisées dans tout le tableau pour afficher ses données. Cela dit, votre UITableViewController est responsable de la configuration des cellules et de leur transmission au système (et possède le chemin de l'index, bien sûr). Vous pouvez, à ce stade, faire quelque chose comme:

scroll top