Comment get l'indexPath d'un UIButton dans un UITableViewCell?

J'ai une UITableview avec plusieurs cellules. Sur chaque cellule, j'ajoute dynamicment des buttons selon le nombre de arrays. Donc, quand je clique sur un button, je suis en mesure d'get la valeur de l' tag du button. Mais comment get l' indexPath de cette cellule?

Voici mon code dans -cellForRowAtIndexPath :

  UIView *view=(UIView*)[cell.contentView viewWithTag:indexPath.row+444]; UIImageView *img=(UIImageView*)[cell.contentView viewWithTag:indexPath.row+999]; img.image=[UIImage imageNamed:@"BHCS_empty.png"]; if(integer!=50) { NSInteger y_axis=0; NSArray *Arr=[tableSubCategoryArr objectAtIndex:indexPath.row]; img.image=[UIImage imageNamed:@"BHCS_selected.png"]; view.Frame= CGRectMake(0,50,281, integer-50); for (int i=0; i<[Arr count]; i++) { NSLog(@"arr %@",[Arr objectAtIndex:i]); UIButton *Btn=[UIButton buttonWithType: UIButtonTypeCustom]; Btn.frame=CGRectMake(0, y_axis, 281, 44); [Btn setImage:[UIImage imageNamed:@"BHCS_panel.png"] forState:UIControlStateNormal]; [Btn addTarget:self action:@selector(subCategoryBtnClicked:) forControlEvents:UIControlEventTouchUpInside]; [Btn setTag:i+100]; [view addSubview:Btn]; UILabel *nameLbl=[[UILabel alloc]initWithFrame:CGRectMake(20, y_axis,248, 44)]; nameLbl.text = [[Arr objectAtIndex:i]objectForKey:@"SubCategoryName"]; nameLbl.textColor = [UIColor whiteColor]; nameLbl.backgroundColor=[UIColor clearColor]; panelTableView.separatorColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"BHCS_panel_div1.png"]]; nameLbl.font = [UIFont fontWithName:@"Helvetica" size:12.0f]; [view addSubview:nameLbl]; y_axis=y_axis+44+1.3f; } } 

J'ai essayé le maximum de réponses données, mais à la et j'utilise généralement pour aller le plus généralisé et idéal comme suit:

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

TOUJOURS des réponses ici sont mauvaises et vous ne devriez pas être en boucle dans les superviews. Exemple classique, avec iOS 7 Apple a changé la hiérarchie de tableViewCell et votre application va maintenant tomber en panne!

Utilisez ceci à la place:

Comment connaître le numéro de ligne UITableview

Merci à tout ce que je slove en utilisant le code ci-dessous

  NSIndexPath *indexPath = [panelTableView indexPathForCell:(UITableViewCell *)sender.superview.superview]; NSLog(@"%d",indexPath.row); 

Réponse mise à jour

Utilisez-le comme:

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

Aucune de ces réponses ne semble être une solution très propre. La façon dont j'implémenterais ceci est en utilisant le model de délégué. Le controller de vue est le délégué de la cellule, ce qui signifie que vous laissez la cellule gérer elle-même le button, et elle indique à son délégué quand le button a été pressé afin qu'il puisse le gérer comme il le souhaite.

Imaginons que vous ayez une tableview dans laquelle chaque cellule représente un object Person , et lorsque vous appuyez sur le button, vous voulez afficher un profil pour cette personne. Tout ce que vous devez faire est ceci:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { PersonCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customTableViewCell" forIndexPath:indexPath]; cell.delegate = self; cell.person = self.people[indexPath.row]; return cell; } - (void)personCell:(PersonCell *)personCell didPressButtonForPerson:(Person *)person { [self showProfileForPerson:person]; } 

Ensuite, tout ce que vous devez faire dans votre class de buttons est d'append une propriété appelée buttonPressedHandler qui est un bloc qui renvoie une instance de Person , et lorsque vous créez votre button et ajoutez la cible, faites quelque chose comme ceci:

 - (void)viewDidLoad { [super viewDidLoad]; // do whatever whatever else you need/want to here [self.button addTarget:self selector:@selector(handleButtonPressed) forState:UIControlStateNormal]; } - (void)handleButtonPressed { // Make sure this is a required delegate method, or you check that your delegate responds to this selector first... [self.delegate personCell:self didPressButtonForPerson:self.person]; } 

Mettez ce code dans la méthode d'action du button:

 NSIndexPath *indexPath = [yourtableviewname indexPathForCell:(UITableViewCell *)sender.superview]; NSLog(@"%d",indexPath.row); 

Je suggère d'append une propriété à votre class d'implémentation UITableViewCell personnalisée pour stocker l'indexPath. Ensuite, lorsque votre délégué cellForRowAtIndexPath se triggers dans votre TableViewController, définissez la propriété indexPath pour cette cellule.

customTableViewCell.h:

 @interface customTableViewCell : UITableViewCell @property NSIndexPath *indexPath; @end 

Cellule de configuration customTableViewController:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { customTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customTableViewCell" forIndexPath:indexPath]; // Do whatever you want with your cell cell.indexPath = indexPath; return cell; } 

Ensuite, vous pouvez vous référer à la propriété indexPath dans votre customTableViewCell en appelant self.indexPath

Vous pouvez utiliser la UITableView de indexPathForCell: comme si [tableView indexPathForCell:cell]; . Bonne chance!