J'ai un contrôleur tableview qui affiche une rangée de cellules. Chaque cellule a 3 boutons. J'ai numéroté les balises pour chaque cellule à 1,2,3. Le problème est que je ne sais pas comment trouver sur quelle cellule un bouton est enfoncé. Je ne reçois actuellement le tag de l'expéditeur que lorsque l'un des boutons a été enfoncé. Existe-t-il également un moyen d'obtenir le numéro de ligne de cellule lorsqu'un bouton est enfoncé?
la source
convertPoint:*to*View
ne l' est pasconvertPoint:*from*View
. J'ai utilisé la saisie semi-automatique Xcode et je me suis retrouvé avec la méthode fromView, ce qui ne fonctionnait que ...Edit: Cette réponse est obsolète. Veuillez utiliser cette méthode à la place
Essaye ça:
-(void)button1Tapped:(id)sender { UIButton *senderButton = (UIButton *)sender; UITableViewCell *buttonCell = (UITableViewCell *)[senderButton superview]; UITableView* table = (UITableView *)[buttonCell superview]; NSIndexPath* pathOfTheCell = [table indexPathForCell:buttonCell]; NSInteger rowOfTheCell = [pathOfTheCell row]; NSLog(@"rowofthecell %d", rowOfTheCell); }
Modifier: si vous utilisez contentView, utilisez plutôt ceci pour buttonCell:
UITableViewCell *buttonCell = (UITableViewCell *)senderButton.superview.superview;
la source
contentView
propriété - cette solution ne fonctionne donc pas vraiment.Je recommanderais cette façon de récupérer l'indexPath de la cellule qui a une sous-vue personnalisée - ( compatible avec iOS 7 ainsi que toutes les versions précédentes )
-(void)button1Tapped:(id)sender { //- (void)cellSubviewTapped:(UIGestureRecognizer *)gestureRecognizer { // UIView *parentCell = gestureRecognizer.view.superview; UIView *parentCell = sender.superview; while (![parentCell isKindOfClass:[UITableViewCell class]]) { // iOS 7 onwards the table cell hierachy has changed. parentCell = parentCell.superview; } UIView *parentView = parentCell.superview; while (![parentView isKindOfClass:[UITableView class]]) { // iOS 7 onwards the table cell hierachy has changed. parentView = parentView.superview; } UITableView *tableView = (UITableView *)parentView; NSIndexPath *indexPath = [tableView indexPathForCell:(UITableViewCell *)parentCell]; NSLog(@"indexPath = %@", indexPath); }
Cela ne nécessite pas non
self.tablview
plus.Notez également le code commenté qui est utile si vous voulez le même via un @selector de UIGestureRecognizer ajouté à votre sous-vue personnalisée.
la source
Il y a deux manières:
@ H2CO3 a raison. Vous pouvez faire ce que @ user523234 a suggéré, mais avec une petite modification, pour respecter le UITableViewCellContentView qui doit se trouver entre l'UIButton et l'UITableViewCell. Donc pour modifier son code:
- (IBAction)button1Tapped:(id)sender { UIButton *senderButton = (UIButton *)sender; UITableViewCellContentView *cellContentView = (UITableViewCellContentView *)senderButton.superview; UITableViewCell *tableViewCell = (UITableViewCell *)cellContentView.superview; UITableView* tableView = (UITableView *)tableViewCell.superview; NSIndexPath* pathOfTheCell = [tableView indexPathForCell:tableViewCell]; NSInteger rowOfTheCell = pathOfTheCell.row; NSLog(@"rowofthecell %d", rowOfTheCell); }
Si vous créez un UITableViewCell personnalisé (votre propre sous-classe), vous pouvez simplement appeler
self
IBAction. Vous pouvez lier la fonction IBAction à votre bouton à l'aide du storyboard ou par programme lorsque vous configurez la cellule.- (IBAction)button1Tapped:(id)sender { UITableView* tableView = (UITableView *)self.superview; NSIndexPath* pathOfTheCell = [tableView indexPathForCell:self]; NSInteger rowOfTheCell = pathOfTheCell.row; NSLog(@"rowofthecell %d", rowOfTheCell); }
la source
Je suppose que vous ajoutez des boutons à la cellule
cellForRowAtIndexPath
, alors ce que je ferais, c'est créer une sous-classe de classe personnaliséeUIButton
, ajouter une balise appeléerowNumber
et ajouter ces données pendant que vous ajoutez un bouton à la cellule.la source
UIButton
pour cela.tag
est une propriété commune deUIView
.Un autre moyen simple:
Obtenez le point de contact dans tableView
Ensuite, obtenez le chemin d'index de la cellule au point
Le chemin de l'index contient l'index de ligne
Le code est:
- (void)buttonTapped:(id)sender { UITapGestureRecognizer *tap = (UITapGestureRecognizer *)sender; CGPoint point = [tap locationInView:theTableView]; NSIndexPath *theIndexPath = [theTableView indexPathForRowAtPoint:point]; NSInteger theRowIndex = theIndexPath.row; // do your stuff here // ... }
la source
Swift 3
Remarque: Cela devrait vraiment aller dans la réponse acceptée ci-dessus, sauf que meta fronce les sourcils sur de telles modifications.
@IBAction func doSomething(_ sender: UIButton) { let buttonPosition = sender.convert(CGPoint(), to: tableView) let index = tableView.indexPathForRow(at: buttonPosition) }
Deux commentaires mineurs:
la source
Une solution pourrait être de vérifier la balise de la vue supervisée du bouton ou même plus haut dans la hiérarchie de la vue (si le bouton est dans la vue de contenu de la cellule).
la source
Je souhaite partager du code dans Swift -
extension UITableView { func indexPathForCellContainingView(view1:UIView?)->NSIndexPath? { var view = view1; while view != nil { if (view?.isKindOfClass(UITableViewCell) == true) { return self.indexPathForCell(view as! UITableViewCell)! } else { view = view?.superview; } } return nil } }
la source
En rapide:
@IBAction func buttonAction(_ sender: UIButton) { guard let indexPath = tableView.indexPathForRow(at: sender.convert(CGPoint(), to: tableView)) else { return } // do something }
la source