Storyboard-Übergang vom View Controller zu sich selbst

76

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:

Geben Sie hier die Bildbeschreibung ein

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?

Jorge
quelle
1
Ja, mit xcode 5 können Sie. siehe Beitrag .
John Henckel
Öffnen Sie das Editor-Menü, klicken Sie Show Document Outlineund ziehen Sie mit der rechten Maustaste aus der Zelle in das Dateilistenobjekt der Gliederung ViewController.
DawnSong

Antworten:

26

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 .

TJ
quelle
4
Das hat mich auf den richtigen Weg gebracht. Ich habe eine Schaltfläche im "Dock" hinzugefügt und sie mit dem Dateilisten-Ansichts-Controller verbunden. Jetzt kann ich den Übergang programmgesteuert durchführen, wie ich wollte. Vielen Dank!
Jorge
1
Ich wünschte, dies wäre nicht nur notwendig, um sich selbst zu trennen, aber das funktioniert.
Jogloran
2
Mustafas Lösung ist weniger hackig und ziemlich unkompliziert. Wenn Sie mit Phantomschaltflächen zu denselben Ansichten wechseln, wird Ihr Storyboard nur zu einem Chaos.
Strada
43

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];
Jim True
quelle
Sowohl diese als auch die @ TJ / @ Jorge-Methode funktionieren. Ich habe diesen Weg gewählt, weil er sich sauberer anfühlt. Vorteile, die ich bei der anderen Methode sehen kann, sind, dass Sie Ihre Looping-Segmente im Storyboard sehen können und dass Sie Ihre gesamte Navigation in "prepareForSegue:"
siburb
1
Hat perfekt funktioniert! Dies ist auch die "Storyboard-ID" in XCode, die er auf "VDI" gesetzt hat, für diejenigen, die dies neu erstellen möchten.
Nerrolken
31

Mit Xcode 5 gibt es eine viel einfachere Lösung.

  1. Klicken Sie auf die Tabellenzelle im Storyboard
  2. Öffnen Sie den Verbindungsinspektor (Rechtspfeilsymbol oben rechts).
  3. Unter "Ausgelöste Segmente" sehen Sie "Auswahl"
  4. Ziehen Sie aus dem Kreis neben "Auswahl" in die Zelle im Storyboard

Das ist es.

John Henckel
quelle
2
Dieser Ansatz funktioniert wie ein Zauber ohne Codezeile.
John Smith
2
Dies ist die richtige Antwort für xcode 5+ und heutzutage sollten Sie hierfür einen "show" -Segue verwenden.
CupawnTae
2
Scheint bei mir nicht zu funktionieren, der View Controller wird nicht "blau", um das Hinzufügen des Segues zu ermöglichen.
db0
24

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.

Mustafa
quelle
Ich mag die Phantom-Button-Lösung besser, wenn alle meine Vorwärtsübergänge durch prepareForSegue gehen: anstatt sich daran zu erinnern, ob ein Übergang in IB oder Code erstellt wurde.
Steve Moser
19

Interface Builder-Ansatz: Wechseln Sie einfach zu einer Storyboard-Referenz, die auf den präsentierenden View Controller verweist.

Joshua C. Lerner
quelle
2
Dieser Ansatz ist der schönste, wenn andere Navigationen mit Segues in IB durchgeführt werden! Vielen Dank!
Roland T.
Sollte definitiv die akzeptierte Antwort sein, da jetzt eine Storyboard-Referenz verfügbar ist (was nicht der Fall war, als die Frage gestellt wurde)
Christophe Blin
Ich fand, dass dies die eleganteste Lösung ist, die es jetzt gibt
ZShock
4
Zusätzliche Details: Sie müssen Ihrem Controller eine Storyboard-ID geben und diese ID dann im Feld Referenzierte ID der Referenz verwenden.
John J. Camilleri
17

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.

Geben Sie hier die Bildbeschreibung ein

Sethmr
quelle
12

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);
}
Chris
quelle
4

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).

Wiederherstellungs-ID

Tomas Andrle
quelle
0

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"; }
Yari
quelle