2012-04-15 15 views
6

Wenn ich auf ein bestimmtes Listenelement in meinem UITableView klicke, möchte ich den Index des Elements, auf das ich geklickt habe, an die nächste Detailansicht übergeben.Pass-Index-Nummer zwischen UITableView List-Segment

Dies ist mein entsprechender Code so weit:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    HomeworkDetails *view = [[HomeworkDetails alloc] init]; 


    int lastIndex = [indexPath indexAtPosition:[indexPath length] - 1]; 
    NSLog(@"%u", lastIndex); 

    [self performSegueWithIdentifier: @"HomeworkDetailsSegue" sender:self]; 
    view.currentIndex = lastIndex; 

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

} 

An dieser Stelle kann ich erfolgreich in den nächsten Viewcontroller weitergehen (HomeworkDetails), aber die Information nicht durchlaufen. Ich versuche, dies zu tun, indem Sie view.currentIndex = lastIndex; tun, aber das funktioniert nicht. Wie sonst kann ich das tun? Entschuldigung, wenn ich etwas verpasst habe; Ich bin ein Anfänger bei der Entwicklung von iOS.

Mit Vorschläge:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 


    HomeworkDetails *view = [[HomeworkDetails alloc] init]; 


    int lastIndex = [indexPath indexAtPosition:[indexPath length] - 1]; 
    NSLog(@"%u", lastIndex); 

    [self performSegueWithIdentifier: @"HomeworkDetailsSegue" sender:self]; 
    view.currentIndex = lastIndex; 

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 



} 


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"HomeworkDetailsSegue"]) { 

     // note that "sender" will be the tableView cell that was selected 
     UITableViewCell *cell = (UITableViewCell*)sender; 
     NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; //**error** 


     HomeworkDetails *vc = (HomeworkDetails*)[segue destinationViewController]; 
     vc.currentIndex = indexPath.row; 
    } 
} 

Error from Compiler

+0

Ist "currentIndex" eine Eigenschaft auf Ihrem tableView-Controller oder auf dem Ziel-ViewController des Segments? – jonkroll

+0

Es ist eine Eigenschaft auf dem Ziel ViewController. Entschuldigung für die Verwirrung. Zum Testen setze ich im Prinzip eine TextView auf den Zielcontroller dieser Eigenschaft, aber es ist immer 0. – Kgrover

Antwort

18

Was Sie beschreiben, kann am besten in der prepareForSegue:sender: Methode statt didSelectRowAtIndexPath: getan werden. Stellen Sie in Ihrem Storyboard sicher, dass Ihr Segment HomeworkDetailsSegue zwischen der Prototypzelle Ihres TableViews und dem Zielansicht-Controller eingerichtet ist.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{  
    if ([segue.identifier isEqualToString:@"HomeworkDetailsSegue"]) { 

     // note that "sender" will be the tableView cell that was selected 
     UITableViewCell *cell = (UITableViewCell*)sender; 
     NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 

     HomeworkDetails *vc = (HomeworkDetails*)[segue destinationViewController]; 
     vc.currentIndex = indexPath.row; 
    } 
} 

auch als eine Frage des Stils, würde ich empfehlen, Ihre HomeworkDetails Klasse HomeworkDetailsViewController umbenennen. Dies entspricht Apples Konventionen und verdeutlicht, was die Klasse repräsentiert.

+0

Ich erhalte einen Fehler in dieser Zeile: 'self.tableView indexPathForCell: cell];' und der Compiler sagt, dass TableView keine Eigenschaft der aktuellen Schnittstelle ist. Und was meinst du mit "stelle sicher, dass es zwischen den Zellen deines TableViews und dem Zielansicht-Controller eingerichtet ist" Ich vermute, dass dies das Problem sein könnte; ab sofort ist der Übergang zwischen meinem currentViewController und dem nextViewController ... wie mache ich es stattdessen von der tableView? – Kgrover

+0

Die 'prepareForSegue:' Methode sollte ein Teil der Klasse Ihres Tableview-Controllers sein, nicht der HomeworkDetails-Klasse. Um den Abschnitt einzurichten, klicken Sie im Storyboard auf die Prototypzelle des Tabellenansichtsbereichs, damit die Zelle ausgewählt wird. Halten Sie dann die Strg-Taste gedrückt, während Sie von dieser Zelle auf den Zielansicht-Controller ziehen. Schließlich legen Sie die Kennung für Ihr Segment im Eigenschafteninspektor auf "HomeworkDetailsSegue" fest. – jonkroll

+0

Es ist Teil meiner ursprünglichen Klasse, wie ich glaube, dass es sein sollte. Es ist in der Klasse, wo ich ursprünglich meine Überleitung initiiere. Alles, was ich sagen will, ist, dass der Übergang jetzt von ViewController -> Destination ViewController im Storyboard geht. Soll das so sein oder sollte es von UITableView -> Destination ViewController sein und wie mache ich das? Auch der Fehler, den es gibt, ist Property IndexPathForCell nicht auf Objekt vom Typ "HomeworkPage" gefunden. HomeworkPage ist mein ursprünglicher ViewController, der die TableView enthält. – Kgrover

0

Sie sollten die Indexeigenschaft in der neuen Ansicht vor segueing, um es mit performSegueWityIdentifier gesetzt. Um noch einen Schritt weiter zu gehen, erfordert die Best-Practice-Codierungskonvention das Einrichten der neuen Ansicht unter Verwendung der Standardmethode prepareForSegue.

Verwandte Themen