2014-10-09 1 views
25
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    { 
    if ([segue.identifier isEqualToString:@"Action"]) 
    { 
     NSIndexPath *indexPath = [self.tbl indexPathForSelectedRow]; 
     SecondViewController *destViewController = segue.destinationViewController; 
     destViewController.getString = [getArray objectAtIndex:indexPath.row]; 
    } 
} 

I Wanna per accedere alla riga selezionata index, ma mostrano null per ogni riga selezionata. mi aiuti per favore?Come arrivare indexpath in prepareForSegue

+0

Pls verificare self.tbl! = Nil – Matz

+0

Non hai ha reso la connessione di tbl variabile a tableview in storyboard. – Rajesh

risposta

25

Swift 3.0/iOS 10

tableView.indexPathForSelectedRow è stato introdotto in iOS 9

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let indexPath = tableView.indexPathForSelectedRow{ 
     let selectedRow = indexPath.row 
     let detailVC = segue.destination as! ParkDetailTableVC 
     detailVC.park = self.parksArray[selectedRow] 
    } 
} 
+0

notare anche la proprietà in parallelo sulle opinioni di raccolta, 'indexPathsForSelectedItems', che potrebbe essere utilizzato in questo modo: ' '' se lasciare selectedIndexPathRow = CollectionView .indexPathsForSelectedItems .first .row { doStuff (con:??? MyDataSourceArr [selectedIndexPathRow] } '' ' – AmitaiB

+0

Questa semplice soluzione mi ha salvato la giornata :) – iPhoneDeveloper

+0

Grazie! Questo mi ha salvato! –

0

scusa, non capisco cosa vuoi fare. è possibile ottenere il indexPath.row attraverso questo metodo di UITAbleViewDelegate che si chiama quando si tocca la cellula del vostro tableView:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

    self.myVariable = indexPath.row 
} 

e poi si può accedere a questo valore nella prepareForSegue in questo modo:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
     //do something with self.myVariable 
} 

Spero di averti aiutato.

+0

Questo non è necessariamente vero se si tocca quella cella alza il Segue. Non funzionerebbe – Spacemonkey

63

Due casi:

1) Segue collegati dal viewController

chiamata segue dal tuo metodo didSelectRowAtIndexPath, passa indexPath come sender

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self performSegueWithIdentifier:@"Action" sender:indexPath]; 
} 

Poi si può ottenere indexPath come mittente nella prepareForSegue:sender: metodo

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"Action"]) 
     { 
      NSIndexPath *indexPath = (NSIndexPath *)sender; 
      SecondViewController *destViewController = segue.destinationViewController; 
      destViewController.getString = [getArray objectAtIndex:indexPath.row]; 
     } 
    } 

2) segue collegato dalla cella

necessario implementare didSelectRowAtIndexPath metodo e performSegueWithIdentifier: .You può direttamente ottenere sender come UITableviewCell in prepareForSegue:sender: metodo.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"Action"]) 
    { 
     NSIndexPath *indexPath = [self.tableView indexPathForCell:sender]; 
     SecondViewController *destViewController = segue.destinationViewController; 
     destViewController.getString = [getArray objectAtIndex:indexPath.row]; 
    } 
} 
+1

@PintuRajput, non dovresti farlo in questo modo se hai collegato il seguito direttamente dalla cella. In tal caso, l'argomento del mittente sarà la cella, ed è possibile utilizzare il metodo tableView indexPathForCell: per ottenere indexPath dal mittente. Se i tuoi passaggi provengono dalla cella, non devi implementare didSelectRowAtIndexPath o chiamare performSegue. – rdelmar

+0

Questo è vero, nel mio caso il seguito di ViewController stesso. –

+0

Grazie per l'informazione! – Tommy

3

Ti piace questa

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UITableViewCell *)sender { 
    FTGDetailVC *detailVC = (id)segue.destinationViewController; 
    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender]; 

    FTGNote *note = self.notes[indexPath.row]; 
    [detailVC updateWithNote:note]; 
}