Wie kann ich ViewController in Swift schließen?


213

Ich versuche , einen Viewcontroller in schnellen zu entlassen durch den Aufruf dismissViewControllerin einemIBAction

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

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

zufälliges Bild eines Segues

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


2
Wie haben Sie den View Controller präsentiert?
Dasdom

Ich habe das Mapping durchgeführt, indem ich einen Segue gesetzt habe - "show", siehe den beigefügten Screenshot.
Rshankar

4
Versuchen Sie, modal zu verwenden. Wenn Sie Push verwenden, sollten Sie es mit der Pop-Methode des Navigationscontrollers schließen.
Dasdom

Antworten:


414

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

Mit dismissViewControllerAnimatedwird ViewController geschlossen, die mit modal dargestellt wurden

Swift 2

navigationController.popViewControllerAnimated(true)

Swift 4

navigationController?.popViewController(animated: true)

dismiss(animated: true, completion: nil)

6
Wie würden Sie es für einen "Show Detail" -Segue machen?
MoralCode

2
Für Swift 2.2 NavigationController! .PopViewControllerAnimated (true)
SwiftBoy

7
Für Swift 3 NavigationController! .PopViewController (animiert: true)
Alex Trott

174

Ich habe eine Lösung für Ihr Problem. Versuchen Sie diesen Code, um den Ansichts-Controller zu schließen, wenn Sie die Ansicht mit modal präsentieren:

Swift 3:

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

ODER

Wenn Sie die Ansicht mit "Push" -Segue präsentieren

self.navigationController?.popViewController(animated: true)

1
Danke, aber immer noch das gleiche Ergebnis, es entlässt den ViewController
rshankar

4
Wie unterscheidet sich das von der Methode, die das OP verwendet?
Dasdom

30
Konversation ist nutzlos, wenn Sie nicht auf meine Fragen reagieren.
Dasdom

_ = self.navigationController? .popViewController (animiert: true)
Valexa

19

Wenn Sie dies tun, erhalten Sie möglicherweise keine gedruckte Nachricht in der Konsole.

@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")
  }    
}

1
stackoverflow.com/questions/30840235/… . Hilfe, bitte? Ich bin so lange dabei, wer immer noch keine Lösung finden kann
Thiha Aung

14

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 "platzen" lassen:

self.navigationController?.popViewController(animated: true)

entlassen funktioniert nicht, weil ich pushViewController verwende. Nur self.navigationController? .PVViewController (animiert: true) funktioniert.
iOS

13
  1. Betten Sie die Ansicht, die Sie schließen möchten, in einen NavigationController ein
  2. Fügen Sie einen BarButton mit "Done" als Kennung 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ügen Sie diese Zeile in die Klammern ein:

    self.dismissViewControllerAnimated(true, completion: nil)

12

Verwenden:

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

anstatt:

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

1
füge hinzu ein ! zum Navigationscontroller und es funktioniert für mich
Jason G

1
@naturalc: Seien Sie sich bewusst , dass , wenn Navigation null ist und Sie setzen, wird die App zum Absturz bringen!
jobima

8

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

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

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


du hast meinen Tag gerettet.
Shanu Singh

6

Aufgrund meiner Erfahrung füge ich eine Methode hinzu, um mich als Erweiterung von UIViewController abzulehnen:

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 UIViewControllerUnterklasse zu schließen. Zum Beispiel in der Abbruchaktion:

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

6

Aus Apple- Dokumentationen :

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

Daher ist es eine schlechte Praxis, die Entlassungsmethode einfach selbst aufzurufen .

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

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

4

Erstellen Sie keinen Übergang von Abbrechen oder Fertig zu einem anderen VC und schreiben Sie diesen Code nur in Ihre Schaltflächen @IBAction

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

3

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 auf den vorherigen Ansichts-Controller, wo Sie zum vorherigen Controller zurückkehren möchten
  3. Lassen Sie nun den Rechtsklick los und Sie können einige Aktionen sehen, die auf der Schaltfläche Abbrechen ausgeführt 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 die Schaltfläche Abbrechen klicken

Bitte versuchen Sie es, es funktioniert mit mir.

Zweiter Weg - Verwendung - navigationController.popViewControllerAnimated(true)

Bestes Glück..


stackoverflow.com/questions/30840235/… . Hilfe, bitte? Ich bin so lange dabei, wer immer noch keine Lösung finden kann
Thiha Aung

3
Das ist falsch. Sie schließen niemals die Ansicht ab, sondern präsentieren stattdessen einen neuen Ansichts-Controller über dem aktuellen, was zu einem Speicherverlust führt. Dadurch wird Ihre App höchstwahrscheinlich aus dem App Store abgelehnt.
3366784

2

Beachten Sie als Referenz, dass Sie möglicherweise den falschen Ansichts-Controller schließen. Zum Beispiel, wenn eine Warnbox oder ein Modal über einem anderen Modal angezeigt wird. (Möglicherweise wird zusätzlich zu Ihrer aktuellen modalen Warnung eine Twitter-Post-Benachrichtigung angezeigt.) In diesem Fall müssen Sie zweimal "Entlassen" aufrufen oder einen Abwicklungsbereich verwenden.


1

Wenn Sie einen ViewController modal präsentieren und zum Root-ViewController zurückkehren möchten, müssen Sie diesen modal präsentierten ViewController schließen, bevor Sie zum Root-ViewController zurückkehren. Andernfalls wird dieser ViewController nicht aus dem Speicher entfernt und führt zu Speicherverlusten.


1

In Swift 3.0

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

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

1

In Swift 4.1 und Xcode 9.4.1

Wenn Sie pushViewController verwenden, um einen neuen Ansichts-Controller zu präsentieren, verwenden Sie diesen

self.navigationController?.popViewController(animated: false)

Eine weitere Antwort zum Kopieren und Einfügen
J. Doe

1

Versuche dies:

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

Bei der Methode "entlassenViewController" wird nur ein einziger Parameter verwendet. Ich nehme an, dies würde so aussehen, als würde die animierte Ansicht zur vorherigen Ansicht geschlossen. Dies ist die einfachste Lösung.
Cassiodiego

0

Dieser Code wurde in Button-Aktion geschrieben, um zu schließen

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

1
Während dieses Code-Snippet die Frage lösen kann, hilft das Hinzufügen einer Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
DimaSan


0

Wenn Sie die vorliegende Methode in der übergeordneten VC verwenden, sollten Sie diese Funktion aufrufen, um die untergeordnete VC zu schließen

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

Wenn Sie die untergeordnete VC mithilfe der Push-Methode aufrufen, verwenden Sie diese Option, um die untergeordnete VC zu schließen

self.navigationController?.popViewController(animated: true)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.