UIButton dans UITableViewController
-
08-07-2019 - |
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?
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:
- En supposant qu'il s'agisse d'une classe de cellule personnalisée, définissez une propriété sur l'instance de cellule pour identifier la ligne affichée et celle que votre bouton pourra utiliser par la suite.
- Si vous placez ces boutons dans les cellules en tant que vues accessoires, consultez le
table:: >
- S'il s'agit d'une table à une section, vous pouvez faire quelque chose de vraiment déplaisant, comme stocker l'index des lignes dans la propriété
balise
du bouton. Votre méthodestartVote:
reçoit le bouton et peut ensuite extraire sa balise. - S'il s'agit d'une table à une section, vous pouvez faire quelque chose de vraiment déplaisant, comme stocker l'index des lignes dans la propriété