84 votes

Obtenir la rangée de la cellule UITableView en appuyant sur un bouton

J'ai un contrôleur de tableview qui affiche une rangée de cellules. Chaque cellule comporte 3 boutons. J'ai numéroté les balises de chaque cellule comme suit : 1, 2, 3. Le problème est que je ne sais pas comment trouver sur quelle cellule on appuie sur un bouton. Actuellement, je ne reçois que l'étiquette de l'expéditeur lorsque l'un des boutons a été pressé. Existe-t-il un moyen d'obtenir également le numéro de ligne de la cellule lorsqu'un bouton est enfoncé ?

278voto

iWasRobbed Points 26926

Vous devriez vraiment utiliser cette méthode à la place :

CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];

Version Swift :

let buttonPosition = sender.convert(CGPoint(), to:tableView)
let indexPath = tableView.indexPathForRow(at:buttonPosition)

Cela vous donnera le indexPath en fonction de la position du bouton qui a été enfoncé. Il suffit alors d'appeler cellForRowAtIndexPath si vous avez besoin de la cellule ou indexPath.row si vous avez besoin du numéro de ligne.

Si vous êtes paranoïaque, vous pouvez vérifier pour if (indexPath) ... avant de l'utiliser, au cas où le indexPath n'est pas trouvé pour ce point sur la vue de la table.

Toutes les autres réponses sont susceptibles de se briser si Apple décide de modifier la structure de l'affichage.

8 votes

Ça, un million de fois. aucun Les autres ont fonctionné, mais celle-ci était parfaite et de loin la solution la plus simple.

2 votes

Cette réponse fonctionne parce qu'elle est le bon solution. Les autres sont des solutions de contournement. Merci !

1 votes

Au cas où vous Ne le fais pas. ont self.tableview veuillez vous référer à ma réponse sur cette page.

40voto

user523234 Points 6873

Edit : Cette réponse est périmée. Veuillez utiliser cette méthode à la place


Essayez ç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);
}

Edit : Si vous utilisez contentView, utilisez ceci pour buttonCell à la place :

UITableViewCell *buttonCell = (UITableViewCell *)senderButton.superview.superview;

1 votes

Vous n'êtes pas censé ajouter des sous-vues à la cellule elle-même, mais uniquement à son contentView Cette solution ne fonctionne donc pas vraiment.

1 votes

Je suis d'accord avec @H2CO3 et je ne pense pas non plus que cela doive être fait en référençant les supervisions. Veuillez voir une meilleure méthode ci-dessous : stackoverflow.com/a/16270198/308315

0 votes

@minimalpop pouvez-vous s'il vous plaît changer la bonne réponse ? pour avoir un meilleur Q/A !

18voto

Ashok Points 2514

Je recommande cette méthode pour récupérer l'indexPath d'une cellule qui a une sous-vue personnalisée - ( compatible avec iOS 7 ainsi qu'avec 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 self.tablview soit.

Remarquez également le code commenté qui est utile si vous souhaitez que la même chose se fasse par le biais d'un @selector de UIGestureRecognizer ajouté à votre sous-vue personnalisée.

0 votes

Qu'en est-il si j'ai besoin de données trouvées dans le uitableviewcontroller ?

0 votes

Si vous avez une barre de recherche et que vous souhaitez savoir quelle table est utilisée en ce moment, vous pouvez également utiliser cette fonction.

0 votes

La hiérarchie des cellules de la table a été modifiée. Pouvez-vous m'aider à comprendre ce qui a été modifié et ce qui peut l'être encore ?

3voto

ghr Points 109

Utilisation de UITableViewCellContentView ne compile pas pour moi (je ne trouve pas cette classe), alors j'utilise cette seule ligne

UITableViewCell *tableViewCell = (UITableViewCell *)sender.superview.superview;

L'utilisation de la balise de la cellule ne fonctionnerait pas dans les tableaux où les lignes peuvent être insérées ou supprimées.

3voto

Mr. T Points 4405

Il y a deux façons de procéder :

  1. @H2CO3 a raison. Vous pouvez faire ce que @user523234 a suggéré, mais avec un petit changement, pour respecter le UITableViewCellContentView qui devrait venir entre le UIButton et le 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);
    }
  2. Si vous créez un UITableViewCell personnalisé (votre propre sous-classe), vous pouvez alors simplement appeler self dans l'action IBA. Vous pouvez lier la fonction IBAction à votre bouton en utilisant le storyboard ou de manière programmatique 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);
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X