2014-10-09 5 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]; 
    } 
} 

ich möchte die ausgewählte Zeile index, zuzugreifen, zeigen aber null für jede ausgewählte Zeile. Bitte hilf mir?Wie indexPath in prepareForSegue bekommen

+0

Pls self.tbl überprüfen! = Nil – Matz

+0

Sie haben nicht Verbindung von tbl-Variable zu Tabellenansicht in Storyboard hergestellt. – Rajesh

Antwort

25

Swift 3.0/iOS 10

tableView.indexPathForSelectedRow wurde in iOS eingeführt 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

Auch die parallele Eigenschaft auf Sammlung Ansichten beachten Sie, 'indexPathsForSelectedItems', die wie so verwendet werden könnten: ' '' wenn lassen selectedIndexPathRow = Collection .indexPathsForSelectedItems .First .row { doStuff (mit:? MyDataSourceArr [selectedIndexPathRow] } '' ' – AmitaiB

+0

Diese einfache Lösung rettete meinen Tag :) – iPhoneDeveloper

+0

Danke! Das hat mich gerettet! –

0

Entschuldigung, ich verstehe nicht, was Sie tun möchten. ist es möglich, die indexPath.row durch diese Methode von UITAbleViewDelegate bekommen, dass es heißt, wenn Sie die Zelle Ihres Tableview tippen:

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

    self.myVariable = indexPath.row 
} 

und dann können Sie auf diesen Wert zugreifen im prepareForSegue auf diese Weise:

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

Ich hoffe, ich habe dir geholfen.

+0

Das ist nicht unbedingt wahr, wenn Sie durch Tippen auf diese Zelle Ihre Segue erhöhen. Würde nicht funktionieren. – Spacemonkey

63

Zwei Fälle:

1) Segue vom viewController verbunden

Anruf segue von Ihrem didSelectRowAtIndexPath Methode, übergeben indexPath als sender

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

Dann können Sie indexPath als Absender in prepareForSegue:sender: Verfahren erhalten

- (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 vom

Keine Notwendigkeit Zelle verbunden didSelectRowAtIndexPath Verfahren zu implementieren und performSegueWithIdentifier: .Sie direkt sender als UITableviewCell in prepareForSegue:sender: Verfahren erhalten.

- (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, sollten Sie es nicht so machen, wenn Sie den Abschnitt direkt von der Zelle verbunden haben. In diesem Fall ist das Absenderargument die Zelle, und Sie können die tableView-Methode indexPathForCell verwenden, um den indexPath vom Absender abzurufen. Wenn Ihr Segment aus der Zelle stammt, sollten Sie didSelectRowAtIndexPath nicht implementieren oder performSegue aufrufen. – rdelmar

+0

Das ist wahr, in meinem Fall der Übergang von ViewController selbst. –

+0

Danke für die Information! – Tommy

3

Gefällt Ihnen dieses

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