wake-up-neo.com

Swift - So lassen Sie alle View-Controller zurück, um zum Root zurückzukehren

Ich möchte, dass meine App zu einem ersten View-Controller gehen kann, wenn der Benutzer dies wünscht.

Ich möchte also eine Funktion erstellen, um alle Ansichtssteuerungen zu verwerfen, unabhängig davon, ob sie in Navigationssteuerungen verschoben oder modal dargestellt oder beliebige Methoden geöffnet werden.

Ich habe verschiedene Möglichkeiten ausprobiert, aber es ist mir nicht gelungen, alle View-Controller mit Sicherheit abzulehnen. Gibt es einen einfachen Weg?

29
Byoth

Versuche dies :

self.view.window?.rootViewController?.dismiss(animated: true, completion: nil)

es sollte alle View-Controller oberhalb des Root-View-Controllers schließen.

Wenn dies nicht funktioniert, können Sie dies manuell tun, indem Sie eine while-Schleife wie diese ausführen.

func dismissViewControllers() {

    guard let vc = self.presentingViewController else { return }

    while (vc.presentingViewController != nil) {
        vc.dismiss(animated: true, completion: nil)
    }
}

Es würde alle viewControllers entlassen, bis es einen PresentingController hat.

Edit: wenn Sie ViewControllers ablehnen möchten, die Sie verwenden können 

self.navigationController?.popToRootViewController(animated: true)

Ich hoffe es hilft.

33
Agent Smith

Wenn Sie die Navigation verwenden, können Sie den ersten Verwenden. Wenn Sie modal präsentieren, können Sie den zweiten verwenden:

Für die Navigation

self.navigationController?.popToRootViewController(animated: true)

Für die modale Präsentation

self.view.window!.rootViewController?.dismissViewControllerAnimated(false, completion: nil)
13
Sandip Gill

Bitten Sie einfach Ihren rootViewController, jeden ViewController zu kündigen, wenn er präsentiert wird.

if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
   appDelegate.window?.rootViewController?.dismiss(animated: true, completion: nil)
   (appDelegate.window?.rootViewController as? UINavigationController)?.popToRootViewController(animated: true)
}
10

hallo alle hier ist die Antwort auf Swift-4

um zum Root-View-Controller zurückzukehren, können Sie einfach eine Codezeile aufrufen und Ihre Arbeit wird erledigt.

 self.view.window?.rootViewController?.dismiss(animated: true, completion: nil)

und wenn Sie den Begrüßungsbildschirm und danach den Anmeldebildschirm haben und zum Anmeldebildschirm wechseln möchten, können Sie einfach presentviewcontroller im obigen Code anhängen

self.view.window?.rootViewController?.presentedViewController!.dismiss(animated: true, completion: nil)
4
ayush pathak
 func  dismiss_all(view: UIView){
   view.window!.rootViewController?.dismiss(animated: true, completion: nil)

 }
2
Softlabsindia

Erstellen Sie einen Entspannungsbereich (Sie finden ihn unter https://developer.Apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/ UsingSegues.html Copyright von Apple Inc.)

In den Abwicklungssegmenten können Sie angezeigte Ansichtscontroller schließen. Sie erstellen Abwicklungssegmente in Interface Builder, indem Sie eine Schaltfläche oder ein anderes geeignetes Objekt mit dem Exit-Objekt des aktuellen Ansichtscontrollers verknüpfen. Wenn der Benutzer auf die Schaltfläche tippt oder mit dem entsprechenden Objekt interagiert, durchsucht UIKit die Ansichtscontrollerhierarchie nach einem Objekt, das das Abwicklungssegment verarbeiten kann. Anschließend werden der aktuelle Ansichts-Controller und alle dazwischen liegenden Ansichts-Controller geschlossen, um das Ziel des Abwicklungssegues anzuzeigen.

So erstellen Sie eine Entspannungsstrecke

  1. Wählen Sie den View Controller, der am Ende eines Abwicklungssegues auf dem Bildschirm angezeigt werden soll.

  2. Definieren Sie eine Abwicklungsmethode auf dem von Ihnen ausgewählten Ansichtscontroller.

Die Swift Syntax für diese Methode lautet wie folgt:

@IBAction func myUnwindAction(unwindSegue: UIStoryboardSegue)

Die Objective-C-Syntax für diese Methode lautet wie folgt:

- (IBAction)myUnwindAction:(UIStoryboardSegue*)unwindSegue

3. Navigieren Sie zu dem Ansichtscontroller, der die Abwicklungsaktion initiiert.

  1. Klicken Sie bei gedrückter Ctrl-Taste auf die Schaltfläche (oder ein anderes Objekt), die den Abwicklungssegue einleiten soll. Dieses Element sollte sich in dem Ansichtscontroller befinden, den Sie schließen möchten.

  2. Ziehen Sie zum Exit-Objekt oben in der View Controller-Szene.

https://developer.Apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/Art/segue_unwind_linking_2x.png

  1. Wählen Sie im Beziehungsfenster Ihre Abwicklungsmethode aus.

Sie müssen eine Abwicklungsaktionsmethode in einem Ihrer Ansichtscontroller definieren, bevor Sie versuchen, das entsprechende Abwicklungssegment in Interface Builder zu erstellen. Das Vorhandensein dieser Methode ist erforderlich und teilt dem Interface Builder mit, dass es ein gültiges Ziel für das Abwicklungssegment gibt.

1
Srinath Shah

Verwenden Sie diesen Code, um präsentierte Viewcontroller zu schließen und zur Navigation rootviewcontroller Swift 4 zu gelangen.

// MARK:- Dismiss and Pop ViewControllers
func dismissPopAllViewViewControllers() {
    if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
        appDelegate.window?.rootViewController?.dismiss(animated: true, completion: nil)
        (appDelegate.window?.rootViewController as? UINavigationController)?.popToRootViewController(animated: true)
    }
}
1
Faris Muhammed

Hebt alle View-Controller auf dem Stack mit Ausnahme des Root-View-Controllers auf und aktualisiert die Anzeige.

func popToRootViewController(animated: Bool)

Wenn Sie jedoch zu einem bestimmten Controller wechseln möchten, verwenden Sie einfach die unten stehende Funktion. 

func popToViewController(UIViewController, animated: Bool)

Öffnet View-Controller, bis der angegebene View-Controller oben im Navigationsstapel angezeigt wird.

1
Shauket Sheikh

Vielleicht ist es das, wonach Sie suchen, um sich zu entspannen.

Segues abwickeln gibt Ihnen die Möglichkeit, den Navigationsstapel über Push, Modal, Popover und andere Arten von Segues "abzuwickeln". Sie verwenden Abwicklungssegmente, um einen oder mehrere Schritte in Ihrer Navigationshierarchie "zurückzugehen".

Link zur Dokumentation: https://developer.Apple.com/library/archive/technotes/tn2298/_index.html

0
Srinath Shah

Um das zu erreichen, was Sie möchten, ändern Sie Ihren Navigations-Stack und führen Sie dann popViewController aus.

let allControllers = NSMutableArray(array: navigationController!.viewControllers)
let vcCount = allControllers.count
for _ in 0 ..< vcCount - 2 {
    allControllers.removeObject(at: 1)
}
// now, allControllers[0] is root VC, allControllers[1] is presently displayed VC. write back to nav stack
navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: false)
// then pop root VC
navigationController!.popViewController(animated: true)

Siehe this für den Weg, den Navigationsstapel weiter zu manipulieren. Wenn Ihr oberster VC modal ist, schließen Sie ihn vor dem obigen Code ab.

0
beshio