2013-04-26 14 views
9

Ho un UITableview con più celle. Su ciascuna cella aggiungo i pulsanti dinamicamente in base a un numero di array. Quindi, quando clicco su un pulsante sono in grado di ottenere il valore tag del pulsante. Ma come ottenere il indexPath di quella cella?Come ottenere il indexPath di un UIButton in un UITableViewCell?

Ecco il mio codice in -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; 
     } 
    } 
+0

Un modo semplice per farlo è creare un'estensione UITableView. Vedere la mia risposta a [questa domanda] (https://stackoverflow.com/a/39059239/3395921) per vedere come può essere fatto. –

risposta

6

Grazie a tutti i slove questo utilizzando sotto il codice

 NSIndexPath *indexPath = [panelTableView indexPathForCell:(UITableViewCell *)sender.superview.superview]; 

NSLog(@"%d",indexPath.row); 
+3

in iOS8..questo darà sempre 0. Si prega di vedere questo .... http: //stackoverflow.com/questions/23784630/how- to-find-indexpath-per-tapped-button-in-tableview-using-seque/27292570 # 27292570 –

+0

Non utilizzare questa risposta. È sbagliato. Non assumere mai una struttura specifica per la gerarchia della vista privata. – rmaddy

-1

È possibile utilizzare il metodo UITableView s' indexPathForCell: in questo modo [tableView indexPathForCell:cell];. In bocca al lupo!

+0

dove dovrei usare questa linea? – user2230971

5

risposta Aggiornato

utilizzarlo come:

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

si blocca su NSIndexPath * indexPath = [visualizza indexPathForCell: cell]; – user2230971

+0

Stai aggiungendo il tuo pulsante direttamente nella cella? Se no, devi andare su superview fino a raggiungere la cella come button.superview.superview e così via. Si prega di verificare il tipo di cella durante il debug, sarà di aiuto. – Amit

+4

NO, NO NO NO! Basta non passare attraverso le interviste! http://stackoverflow.com/questions/9274494/how-to-know-the-uitableview-row-number/9274863#9274863 – CW0007007

0

inserire questo codice nel metodo di azione del pulsante:

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

ma ogni volta che riattivi il tuo indicizzatore zeroth – user2230971

+0

nel tuo codice che stai aggiungendo pulsante per visualizzare è per questo che dà 0 valori significa qui sender.superview preso come vista penso di si. – Balu

+0

hey ho provato in questo modo funziona bene ora in azione pulsante – user2230971

9

ALLLLL delle risposte qui sono pessime e non dovresti passare in rassegna le interviste. Esempio classico, con iOS 7 Apple ha modificato la gerarchia tableViewCell e ora l'app si arresta in modo anomalo!

Utilizzare questo invece:

How to know the UITableview row number

+0

oh. Questa è stata una risposta così breve, solo per collegamenti che ho quasi perso, ma in realtà è davvero buona. Il punto è che il pulsante contiene informazioni su dove si trovava sullo schermo, che può essere facilmente convertito in un percorso dell'indice. – Suz

+0

Vuoi qualificare "cattivo"? Una dipendenza fissa su [someView superview] potrebbe rompersi nel tempo (anche se l'intera gerarchia della vista è controllata dallo sviluppatore dell'app). Ma andare in loop fino a quando non si trova la cella di visualizzazione tabella è sicuramente sicuro ora e in futuro. – danh

0

vi suggerisco di aggiungere una proprietà per la vostra abitudine UITableViewCell classe di implementazione per memorizzare l'indexPath. Quindi, quando il delegato cellForRowAtIndexPath viene attivato in TableViewController, impostare la proprietà indexPath per quella cella.

customTableViewCell.h:

@interface customTableViewCell : UITableViewCell 

@property NSIndexPath *indexPath; 

@end 

cella customTableViewController di configurazione: massima

- (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; 
} 

Quindi è possibile fare riferimento alla proprietà indexPath nel vostro customTableViewCell chiamando self.indexPath

+1

No. non farlo. Se la vista tabella consente di eliminare, inserire o spostare righe, la proprietà 'indexPath' di questa cella personalizzata sarà errata. – rmaddy

23

ho provato di risposte date, ma al e io generalmente uso per la maggior parte modo generalizzato e ideale come segue:

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

Super ... In Swift lasciare dell'hitpoint = sender.convert (CGPoint.zero, a: self.tablename) lasciare indexpath_select = self.Flight_detail_table.indexPathForRow (a: hitpoint) di stampa ("indexpath: \ (Stringa (che descrive: indexpath_select)) ") –

0

Nessuna di queste risposte sembra una soluzione molto pulita. Il modo in cui implementerei questo è usando il pattern delegato. Il controller della vista è il delegato della cella, il che significa che lascia che sia la cella stessa a gestire la pressione del pulsante e comunica al suo delegato quando il pulsante è stato premuto in modo che possa gestirlo come desidera.

Supponiamo di avere una vista tabella dove ogni cella rappresenta un oggetto Person e quando si preme il pulsante si desidera mostrare un profilo per questa persona.Tutto quello che devi fare è questo:

- (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]; 
} 

Poi tutto quello che dovete fare nella vostra classe Button è aggiungere una proprietà chiamata buttonPressedHandler che è un blocco passa indietro un'istanza di Person, e quando si crea il pulsante e aggiungere il target fa qualcosa del genere:

- (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]; 
} 
Problemi correlati