2012-12-03 11 views
13

Ho semplice UITableView con una sezione e poche righe. Quando l'utente fa clic sul pulsante accessorio della cella (che è connesso con detailsSegue. Voglio sapere quale riga della cella era. Quindi posso selezionare l'oggetto giusto dalla mia matrice e assegnarlo alla variabile dalla vista successiva.Come trovare indexPath per il pulsante accessorio toccato in tableView

Ho metodo usato delegato tableview:accessoryButtonTappedForRowWithIndexPath: e il valore indexPath assegnato alla mia proprietà privata myRow. che in prepareForSegue:sender: metodo che ho usato il mio valore self.myRow.row per selezionare oggetto giusto da array.

mio problema è che questi due metodi sembrano di eseguire in modo sbagliato. dal NSLog Posso vedere che il metodo prepareForSegue:sender: viene eseguito per primo e il mio metodo delegato sta cambiando il valore di self.myRow dopo di esso.

Quindi il metodo prepareForSegue:sender: passa sempre oggetto errato alla vista successiva (quella che è stata precedentemente toccata).

Scusate per i miei ragazzi inglesi. Grazie per l'aiuto in anticipo.

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath { 
    self.myRow = indexPath; 
    NSLog(@"tapped button at row: %i",self.myRow.row); 
} 

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if([segue.identifier isEqualToString:@"addSegue"]) { 
     AddViewController *avc = segue.destinationViewController; 
     avc.delegate = self; 
    } 
    else if ([segue.identifier isEqualToString:@"detailsSegue"]) { 
     NSLog(@"Segue row: %i",self.myRow.row); 
     Annotation *annotation = [self.viewsList objectAtIndex:self.myRow.row]; 
     NSLog(@"Segue annotation object: %@",annotation.title); 
     DetailsViewController *dvc = segue.destinationViewController; 
     dvc.wikiKey = annotation.title; 
    } 
} 

risposta

40

Come avete scoperto, il sistema invia il messaggio prepareForSegue:sender:prima di che si invia il messaggio tableview:accessoryButtonTappedForRowWithIndexPath:.

Ma, quando si invia il messaggio prepareForSegue:sender:, l'argomento è la senderUITableViewCell che contiene la vista accessorio. È possibile utilizzare tale per determinare quale tasto accessorio di fila è stato scelto:

else if ([segue.identifier isEqualToString:@"detailsSegue"]) { 
    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender]; 
    Annotation *annotation = [self.viewsList objectAtIndex:indexPath.row]; 
    DetailsViewController *dvc = segue.destinationViewController; 
    dvc.wikiKey = annotation.title; 
} 
+0

+1. Questo dovrebbe risolverlo. – iDev

+1

Grande. Risolve il problema. Grazie. – Guferos

-3

Quello che dovete fare è chiamare il segue di programmazione dal metodo delegato. Supponendo che si sta utilizzando storyboard, è necessario scollegare il segue nello storyboard e nel metodo uso delegato:

[self performSegueWithIdentifier: @"IdentifierNameHere" sender: self]; 
2

Il mittente sarà il pulsante accessorio, giusto? In tal caso dovresti essere in grado di trovare la sua cella contenente salendo attraverso le super viste e quindi ottenere il percorso dell'indice di quella cella. Ho usato un metodo come questo prima di fare la prima parte:

+ (UITableViewCell *)findParentCellOfView:(UIView *)view { 
    if (view == nil || [view isKindOfClass:[UITableViewCell class]]) { 
    return (UITableViewCell *)view; 
    } 
    return [self findParentCellOfView:[view superview]]; 
} 
+1

Il mittente è in realtà la cella, non il pulsante accessorio. –

+1

che semplifica le cose! – zem

2

// ti dico una una scelta facile semplice e una migliore e: -

// Soluzione: - È possibile assegnare tag pulsante di vista accessorio in questo metodo di tableView

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // set accessory view 
    UIButton *oValidHomeAccessryBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 

    // set target of accessory view button 
    [oValidHomeAccessryBtn addTarget:self action:@selector(AccessoryAction:) forControlEvents:UIControlEventTouchUpInside]; 

    // set tag of accessory view button to the row of table 
    oValidHomeAccessryBtn.tag =indexPath.row; 

    // set button to accessory view 
    cell.accessoryView = oValidHomeAccessryBtn ; 
} 

// rendere il metodo è stato superato nel selettore e ottenere valore di tag e si otterrebbe indexPath di vista accessorio cliccato

- (void)AccessoryAction:(id)sender 
{ 
    NSLog(@"%d",[sender tag]); 
} 

Questo è il modo più semplice per ottenere il indexPat della riga in cui è stata selezionata la vista accessoria.

Problemi correlati