web-dev-qa-db-de.com

Wie kann ich ViewController in Swift schließen?

Ich versuche, einen ViewController in Swift zu schließen, indem ich dismissViewController in einem IBAction aufrufe.

  @IBAction func cancel(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
}

@IBAction func done(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
}

random image of a segue

Ich konnte die println-Nachricht in der Konsolenausgabe sehen, aber ViewController wird nie entlassen. Woran könnte das liegen?

191
rshankar

Aus Ihrem Bild geht hervor, dass Sie den ViewController mit Push präsentiert haben

Das dismissViewControllerAnimated wird verwendet, um ViewController zu schließen, die modal dargestellt wurden

Swift 2

navigationController.popViewControllerAnimated(true)

Swift 4

navigationController?.popViewController(animated: true)

dismiss(animated: true, completion: nil)
375
Zoon Nooz

Ich habe eine Lösung für Ihr Problem. Bitte versuchen Sie diesen Code, um den Ansichtscontroller zu schließen, wenn Sie die Ansicht modal darstellen:

Swift 3:

self.dismiss(animated: true, completion: nil)

OR

Wenn Sie die Ansicht mit der Option "Push" anzeigen

self.navigationController?.popViewController(animated: true)
162
satheesh

wenn Sie dies tun, denke ich, dass Sie nicht println Nachricht in der Konsole erhalten,

@IBAction func cancel(sender: AnyObject) {
  if(self.presentingViewController){
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
   }
}

@IBAction func done(sender: AnyObject) {
  if(self.presentingViewController){
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
  }    
}
19
BaSha
  1. betten Sie die Ansicht, die Sie schließen möchten, in einen NavigationController ein
  2. fügen Sie einen BarButton mit "Fertig" als Bezeichner hinzu
  3. rufen Sie den Assistenten-Editor mit der ausgewählten Schaltfläche Fertig auf
  4. erstellen Sie eine IBAction für diese Schaltfläche
  5. füge diese Zeile in die Klammern ein:

    self.dismissViewControllerAnimated(true, completion: nil)
    
13
LAOMUSIC ARTS

In Swift 3.0 bis 4.0 ist es so einfach, dies in Ihre Funktion einzugeben:

self.dismiss(animated: true, completion: nil)

Oder wenn Sie sich in einem Navigationscontroller befinden, können Sie ihn "platzieren":

self.navigationController?.popViewController(animated: true)
12
Chase McElroy

Verwenden:

self.dismiss(animated: true, completion: nil)

anstatt von:

self.navigationController.dismissViewControllerAnimated(true, completion: nil)
11
jobima

Wenn Sie einen Controller ohne Navigationscontroller präsentieren, können Sie den folgenden Code aus einer Methode des präsentierten Controllers aufrufen.

self.presentingViewController?.dismiss(animated: true, completion: nil)

Wenn Ihr ViewController modal dargestellt wird, ist das optionale Darstellen von ViewController nicht gleich Null und der Code wird ausgeführt.

7
Peyotle

Aufgrund meiner Erfahrung füge ich eine Methode hinzu, um mich als Erweiterung für UIViewController zu entlassen:

extension UIViewController {
    func dismissMe(animated: Bool, completion: (()->())?) {
        var count = 0
        if let c = self.navigationController?.viewControllers.count {
            count = c
        }
        if count > 1 {
            self.navigationController?.popViewController(animated: animated)
            if let handler = completion {
                handler()
            }
        } else {
            dismiss(animated: animated, completion: completion)
        }
    }
}

Dann rufe ich diese Methode auf, um den View-Controller in einer beliebigen UIViewController -Unterklasse zu schließen. Beispiel für eine Abbruchaktion:

class MyViewController: UIViewController {
   ...
   @IBAction func cancel(sender: AnyObject) {
     dismissMe(animated: true, completion: nil)
   }
   ...
}
6
David.Chu.ca

Von Apple Dokumentationen :

Der präsentierende Ansichtscontroller ist dafür verantwortlich, den präsentierten Ansichtscontroller zu schließen

Daher ist es eine schlechte Praxis, einfach die dismiss -Methode von sich aus aufzurufen.

Was Sie tun sollten, wenn Sie es modal präsentieren, ist:

presentingViewController?.dismiss(animated: true, completion: nil)
5
OhadM

Erstelle keinen Übergang von Cancel oder Done zu einem anderen VC und schreibe diesen Code nur in deine Buttons @IBAction

@IBAction func cancel(sender: AnyObject) {
    dismiss(animated: false, completion: nil)
}
4
Fatih

Hier ist die eine Möglichkeit, den aktuellen Ansichts-Controller zu schließen und zum vorherigen Ansichts-Controller zurückzukehren. Sie können dies nur über Storyboard tun.

  1. Öffnen Sie das Storyboard
  2. Klicken Sie mit der rechten Maustaste auf die Schaltfläche Abbrechen und ziehen Sie sie zum vorherigen Ansichts-Controller, wo Sie zum vorherigen Controller zurückkehren möchten
  3. Lassen Sie nun den rechten Mausklick los und Sie können einige Aktionen sehen, die auf die Schaltfläche Abbrechen angewendet werden
  4. Wählen Sie nun die Option "Popover vorhanden" aus der Liste
  5. Jetzt können Sie Ihre aktuelle Ansicht schließen, indem Sie auf Abbrechen klicken

Bitte versuchen Sie es, es funktioniert mit mir.

Zweiter Weg - Verwenden Sie - navigationController.popViewControllerAnimated(true)

Bestes Glück..

3
Chetan Bhalara

Beachten Sie als Referenz, dass Sie möglicherweise den falschen Ansichtscontroller schließen. Zum Beispiel, wenn ein Benachrichtigungsfeld oder ein Modal über einem anderen Modal angezeigt wird. (Sie können beispielsweise einen Twitter-Post-Alarm über Ihrem aktuellen Modal-Alarm anzeigen lassen.) In diesem Fall müssen Sie dismiss zweimal aufrufen oder einen Abwicklungssegue verwenden.

2
mcfroob

In Swift 4.1 und Xcode 9.4.1

Wenn Sie mit pushViewController einen neuen View Controller präsentieren, verwenden Sie diesen

self.navigationController?.popViewController(animated: false)
1
iOS

Wenn Sie einen ViewController modal präsentieren und zum Stamm-ViewController zurückkehren möchten, schließen Sie diesen modal präsentierten ViewController, bevor Sie zum Stamm-ViewController zurückkehren. Andernfalls wird dieser ViewController nicht aus dem Speicher entfernt und verursacht Speicherlecks.

1
dan

In Swift 3.

Wenn Sie einen präsentierten Ansichtscontroller schließen möchten

self.dismiss(animated: true, completion: nil)
1
Ramakrishna

Versuche dies:

@IBAction func close() {
  dismiss(animated: true, completion: nil)
}
0
cassiodiego

Dieser Code ist in Button-Aktion geschrieben, um zu verwerfen

  @IBAction func cancel(sender: AnyObject) {
   dismiss(animated: true, completion: nil)
  }
0
Sai kumar Reddy