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")
}
Ich konnte die println-Nachricht in der Konsolenausgabe sehen, aber ViewController wird nie entlassen. Woran könnte das liegen?
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)
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)
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")
}
}
füge diese Zeile in die Klammern ein:
self.dismissViewControllerAnimated(true, completion: nil)
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)
Verwenden:
self.dismiss(animated: true, completion: nil)
anstatt von:
self.navigationController.dismissViewControllerAnimated(true, completion: nil)
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.
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)
}
...
}
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)
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)
}
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.
Bitte versuchen Sie es, es funktioniert mit mir.
Zweiter Weg - Verwenden Sie - navigationController.popViewControllerAnimated(true)
Bestes Glück..
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.
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)
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.
In Swift 3.
Wenn Sie einen präsentierten Ansichtscontroller schließen möchten
self.dismiss(animated: true, completion: nil)
Versuche dies:
@IBAction func close() {
dismiss(animated: true, completion: nil)
}
Dieser Code ist in Button-Aktion geschrieben, um zu verwerfen
@IBAction func cancel(sender: AnyObject) {
dismiss(animated: true, completion: nil)
}