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

chcę, aby przejść do wybranego wiersza index, ale pokazują null dla każdego wybranego wiersza. proszę pomóż mi?Jak zdobyć indexpath w prepareForSegue

+0

Pls sprawdzić self.tbl! = Nil – Matz

+0

nie masz powiązanie zmiennej tbl z tableview w storyboard. – Rajesh

Odpowiedz

25

Swift 3.0/iOS 10

tableView.indexPathForSelectedRow został wprowadzony w 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

pamiętać również właściwość równolegle poglądów zbiórki, 'indexPathsForSelectedItems', który mógłby zostać użyty tak: ' '' jeśli niech selectedIndexPathRow = CollectionView .indexPathsForSelectedItems .first .row { DoStuff (z:? MyDataSourceArr [selectedIndexPathRow] } '' ' – AmitaiB

+0

To proste rozwiązanie uratowało mój dzień :) – iPhoneDeveloper

+0

Dziękujemy! To mnie uratowało! –

0

Przepraszam, nie rozumiem, co chcesz zrobić. to możliwe uzyskać indexPath.row dzięki tej metodzie UITAbleViewDelegate że to się nazywa po dotknięciu komórkę swojej Tableview:

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

    self.myVariable = indexPath.row 
} 

a następnie można uzyskać dostęp do tej wartości w prepareForSegue w ten sposób:

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

Mam nadzieję, że ci pomogłem.

+0

To niekoniecznie musi się zdarzyć, jeśli kliknięcie tej komórki spowoduje podniesienie Segue. Nie zadziałałby. – Spacemonkey

63

dwóch przypadkach:

1) Segue związane z viewController

Wezwania segue z metodą didSelectRowAtIndexPath przechodzą indexPath jak sender

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

Następnie można dostać indexPath jako nadawcy w prepareForSegue:sender: metody

- (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 połączony z komórki

Nie potrzeba wdrożenia didSelectRowAtIndexPath sposób i performSegueWithIdentifier: .you można bezpośrednio uzyskać sender jak UITableviewCell w prepareForSegue:sender: metody.

- (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, nie powinieneś tego robić w ten sposób, jeśli połączyłeś segue bezpośrednio z komórką. W takim przypadku argumentem nadawcy będzie komórka i można użyć metody tableView indexPathForCell: aby pobrać indeks od nadawcy. Jeśli twoja segue pochodzi z komórki, nie powinieneś zaimplementować metody didSelectRowAtIndexPath lub wywołać metody performSegue. – rdelmar

+0

To prawda, w moim przypadku segue z samego ViewController. –

+0

Dzięki za informację! – Tommy

3

Ci się to

- (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]; 
} 
Powiązane problemy