Mit Storyboard ist dies sehr einfach. Sie ziehen die Aktion einfach auf "Beenden". Aber wie soll ich es von meinem Code aus aufrufen?
Mit Storyboard ist dies sehr einfach. Sie ziehen die Aktion einfach auf "Beenden". Aber wie soll ich es von meinem Code aus aufrufen?
Antworten:
Geben Sie den Namen des Segues ein, um sich abzuwickeln.
Dann - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.
identifizieren Sie sich mit Ihrem Segue.
Hier ist eine vollständige Antwort mit Ziel C und Swift:
1) Erstellen Sie einen IBAction
Abwicklungsbereich in Ihrem Zielansichts-Controller (zu dem Sie wechseln möchten). Überall in der Implementierungsdatei.
// Objective C
- (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {
}
// Swift
@IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {
}
2) Ziehen Sie auf dem Quellansichts-Controller (dem Controller, von dem Sie wechseln) ⌃ + von "Name der Aktivität", um den Vorgang zu beenden. Sie sollten den in Schritt 1 erstellten Abwicklungsbereich im Popup sehen. (Wenn Sie es nicht sehen, lesen Sie Schritt eins). Wählen Sie unwindToContainerVC: aus dem Popup oder wie auch immer Sie Ihre Methode benannt haben, um Ihren Quellcontroller mit der Unwind-IBAction zu verbinden.
3) Wählen Sie den Abschnitt in der Dokumentskizze des Storyboards des Quellansichts-Controllers aus (er wird unten aufgelistet) und geben Sie ihm eine Kennung .
4) Aufruf der Abwickelstation segue diese Methode verwenden , Quelle View - Controller, Substituieren Ihre Abwickelstation segue Namen.
// Ziel c
[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];
// Schnell
self.performSegueWithIdentifier("unwindToContainerVC", sender: self)
NB. Verwenden Sie die sourceViewController-Eigenschaft des segue-Parameters für die Unwind-Methode, um auf alle exponierten Eigenschaften des Source-Controllers zuzugreifen. Beachten Sie außerdem, dass das Framework das Entlassen des Quellcontrollers behandelt. Wenn Sie dies bestätigen möchten, fügen Sie dem Quellcontroller eine Freigabemethode mit einer Protokollmeldung hinzu, die ausgelöst werden soll, sobald sie beendet wurde. Wenn der Dealloc nicht ausgelöst wird, haben Sie möglicherweise einen Aufbewahrungszyklus.
(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
ctrl+drag
von ViewController
bis Exit
war unglaublich hilfreich. Vielen Dank!
bradleygriffith
Die Antwort war großartig. Ich habe Schritt 10 gemacht und zur Vereinfachung einen Screenshot gemacht. Dies ist ein Screenshot in Xcode 6.
unwind segue
in der Seitenleiste Folgendes aus:[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
UIViewController
. Dann wird Ihre Lösung funktionieren
Ich habe verwendet, [self dismissViewControllerAnimated: YES completion: nil];
was Sie zur Berufung zurückbringen wird ViewController
.
Zitieren von Text aus Apples technischem Hinweis zum Abwickeln von Segmenten: Um einen Abwicklungsbereich hinzuzufügen, der nur programmgesteuert ausgelöst wird, steuern und ziehen Sie vom View Controller-Symbol der Szene zum Ausgangssymbol und wählen Sie dann eine Abwicklungsaktion für den neuen Abschnitt aus dem Popup-Menü aus.
Die obige Antwort von Vishal Chaudhry hat bei mir funktioniert. Ich würde das auch hinzufügen, um die Sequenz manuell auszulösen, indem ich:
[self performSegueWithIdentifier:@"mySegueName" sender:self];
Im ViewController müssen Sie auch den Abwicklungsbereich unter der ViewController-Szene im Storyboard und in der Eigenschaftenansicht auf der rechten Seite auswählen. Stellen Sie sicher, dass das Feld "Indentifier" den Namen enthält, auf den Sie sich im Code beziehen ("mySegueName" im obigen Beispiel) ).
Wenn Sie diesen Schritt weglassen, wird in der obigen Zeile eine Ausnahme ausgelöst, dass der Name der Sequenz nicht bekannt ist.
Abwärtskompatible Lösung, die für Versionen vor ios6 funktioniert, für Interessenten:
- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {
for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
if ([vc isKindOfClass:vcClass]) {
[self.navigationController popToViewController:vc animated:animated];
return;
}
}
}
SWIFT 4 :
1. Erstellen Sie eine @IBAction mit einem Übergang innerhalb des Controllers, zu dem Sie sich entspannen möchten:
@IBAction func unwindToVC(segue: UIStoryboardSegue) {
}
2. Im Storyboard möchten Sie vom Controller aus Strg + Ziehen vom Controller-Zeichen zum Beenden des Zeichens trennen (abwickeln) und die zuvor erstellte Methode auswählen:
3. Jetzt können Sie feststellen, dass Sie in der Dokumentkontur eine neue Zeile mit dem Titel "Segel abwickeln ..." haben. Jetzt sollten Sie auf diese Zeile klicken und den Attributinspektor öffnen, um die Kennung festzulegen (in meinem Fall unwindSegueIdentifier ).
4. Du bist fast fertig! Jetzt müssen Sie den View Controller öffnen, von dem Sie sich abwickeln möchten, und eine Methode erstellen, die eine Übergabe ausführt. Sie können beispielsweise eine Schaltfläche hinzufügen, sie mit dem Code mit @IBAction verbinden und anschließend in dieser IBAction die Methode perfromSegue (withIdentifier: sender :) hinzufügen :
@IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
}
Das ist alles was Sie tun müssen!
Für diejenigen, die sich fragen, wie dies mit VCs gemacht werden soll, die nicht über das Storyboard eingerichtet wurden (diejenigen, die zu dieser Frage kommen, indem sie "programmatisch" + "sewind segue" suchen).
Da Sie eine Abwicklungssegmentierung nicht programmgesteuert einrichten können, besteht die einfachste rein programmatische Lösung darin, Folgendes aufzurufen:
navigationController?.popToRootViewController(animated: true)
Dadurch werden alle Ansichts-Controller auf dem Stapel wieder auf Ihren Root-Ansichts-Controller verschoben.
Verwenden Sie Folgendes, um nur den obersten Ansichts-Controller aus dem Navigationsstapel zu entfernen:
navigationController?.popViewController(animated: true)
Zu Ihrer Information: Damit die Antwort von @ Vadim mit einer manuellen Abwicklungssequenzaktion funktioniert, die von einem View Controller aus aufgerufen wird, müssen Sie den folgenden Befehl eingeben:
[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];
innerhalb der überschriebenen Klassenmethode viewDidAppear wie folgt :
-(void) viewDidAppear:(BOOL) animated
{
[super viewDidAppear: animated];
[self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}
Wenn Sie es in andere ViewController-Methoden wie viewDidLoad oder viewWillAppear einfügen , wird es ignoriert.
performSegueWithIdentfier
bewirkt genau das: Durchführen des Übergangs von einem ViewController zu einem anderen