Ich versuche, einen Mechanismus zum Drilldown einer Datei- / Ordnerliste zu erstellen. Die Idee ist, jedes Mal, wenn der Benutzer einen Ordner auswählt, denselben Dateilisten-Ansichts-Controller anzuzeigen und einen Dateidetail-Ansichts-Controller anzuzeigen, wenn er eine Datei auswählt.
Bisher habe ich einen Übergang vom Dateilistenansichts-Controller zum Dateidetailansichts-Controller und einen Übergang von der Dateilistentabellenansichtszelle zum Dateilistentabellenansichts-Controller erstellt:
Das Problem dabei ist, dass der Übergang ausgeführt wird, sobald der Benutzer auf die Zelle tippt. Ich möchte den Übergang aus der Zelle der Tabellenansicht entfernen und einen aus dem Controller für die Dateilistenansicht für sich selbst erstellen. Auf diese Weise konnte ich programmgesteuert den richtigen Übergang auslösen, wenn der Benutzer auf die Zelle tippte.
Meine Frage lautet also: Ist es möglich, in Interface Builder einen Übergang von einem Ansichts-Controller zu sich selbst zu erstellen?
Show Document Outline
und ziehen Sie mit der rechten Maustaste aus der Zelle in das Dateilistenobjekt der GliederungViewController
.Antworten:
Ich habe eine Methode entwickelt, um mit einem Phantomknopf einen Übergang zu erstellen. Ich glaube, es wird Ihr Problem lösen. Sie können darüber in meiner Antwort hier lesen .
quelle
Wenn Sie einen Navigationscontroller verwenden, müssen Sie den ViewController in den Navigationsstapel schieben. In diesem Beispiel habe ich meinen ViewController in meiner Storyboard-ID-Einstellung "VDI" genannt.
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil]; YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"]; [self.navigationController pushViewController:dest animated:YES];
Wenn Sie nicht möchten, dass sich der NavigationController weiterhin in Ihren "Zurück" -Historie einfügt, können Sie den Stapel einfügen, bevor Sie ihn wie folgt hinzufügen.
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil]; YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"]; UINavigationController *navController = self.navigationController; [navController popViewControllerAnimated:NO]; [navController pushViewController:dest animated:YES];
quelle
Mit Xcode 5 gibt es eine viel einfachere Lösung.
Das ist es.
quelle
Anstatt einen Übergang zu demselben Controller durchzuführen, können Sie einen View-Controller (denselben) aus dem Storyboard instanziieren und diesen dann auf den Navigations-Controller übertragen.
quelle
Interface Builder-Ansatz: Wechseln Sie einfach zu einer Storyboard-Referenz, die auf den präsentierenden View Controller verweist.
quelle
Die richtige Antwort besteht darin, eine Storyboard-Referenz zu verwenden, die auf den UIViewController verweist, den Sie auf sich selbst übertragen möchten, und dann den Übergang darauf zu richten.
quelle
In IOS 6 gibt es eine sauberere Lösung als die Verwendung einer Phantomtaste. Sie können weiterhin den Übergang von der Tabellenzelle zum Ansichts-Controller definieren und den Absender überprüfen, um den automatisch ausgelösten Übergang abzubrechen:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { //storyboards should use segues and override prepareForSegue instead //but here we need custom logic to determine which segue to use id item = [self.fetchedResultsController objectAtIndexPath:indexPath]; if (item meets condition) { [self performSegueWithIdentifier:@"segue1" sender:self]; } else { [self performSegueWithIdentifier:@"segue2" sender:self]; } } - (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender { //ignore segue from cell since we we are calling manually in didSelectRowAtIndexPath return (sender == self); }
quelle
So können Sie eine andere Instanz des aktuellen Ansichts-Controllers verschieben, ohne einen Abschnitt zu definieren oder seine eigene Kennung fest zu codieren:
SameViewController *same = [self.storyboard instantiateViewControllerWithIdentifier: self.restorationIdentifier]; [self.navigationController pushViewController: same animated: YES];
Sie müssen nur die Wiederherstellungs-ID so einstellen, dass sie mit der Storyboard-ID übereinstimmt (in IB gibt es dafür ein Kontrollkästchen).
quelle
Hoffe das hilft.
Ich fand heraus, dass Sie mehrere Prototypzellen erstellen können.
Dann können Sie jede Zelle (im Storyboard) mit einer anderen Ansicht verknüpfen.
Etwas wie das:
NSString *CellIdentifier = @"Cell"; if (Condition2 ){ CellIdentifier = @"Cell2"; } if (Condition3 ){ CellIdentifier = @"Cell3"; }
quelle