Swift'de ViewController nasıl kapatılır?


214

Ben arayarak Swift bir ViewController görevden çalışıyorum dismissViewControllerbir inIBAction

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

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

bir segue rastgele görüntüsü

Konsol çıktısında println mesajını görebiliyordum ama ViewController hiçbir zaman işten çıkarılmıyor. Sorun ne olabilir?


2
Görüntü denetleyicisini nasıl sundunuz?
dasdom

Bir segue - "show" ayarlayarak haritalama yaptım, ekli ekran görüntüsüne bakın.
rshankar

4
Kip kullanmaya çalışın. Push kullanıyorsanız, gezinti denetleyicisinin pop yöntemiyle kapatmanız gerekir.
dasdom

Yanıtlar:


415

Senden görüntü itmek kullanarak ViewController sundu gibi görünüyor

dismissViewControllerAnimatedModal kullanılarak sunulan yakın ViewControllers için kullanılır

Hızlı 2

navigationController.popViewControllerAnimated(true)

Hızlı 4

navigationController?.popViewController(animated: true)

dismiss(animated: true, completion: nil)

6
'Ayrıntıyı Göster' sekmesi için bunu nasıl yapardınız?
MoralCode

2
For Swift 2.2 ! (True) NavigationController .popViewControllerAnimated
swiftBoy

7
For Swift 3 ! NavigationController .popViewController (animasyonlu: true)
Alex Trott

175

Senin sorunun için bir çözümüm var. Görünümü kip kullanarak sunuyorsanız lütfen görünüm denetleyicisini kapatmak için bu kodu deneyin:

Hızlı 3:

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

VEYA

Görünümü "itme" sekmesini kullanarak sunarsanız

self.navigationController?.popViewController(animated: true)

1
Teşekkürler, ancak yine de aynı sonuç, ViewController'ı reddetmez
rshankar

4
Bu OP'nin kullandığı yöntemden farkı nedir?
dasdom

30
Sorularıma tepki göstermezseniz konuşma işe yaramaz.
dasdom

_ = self.navigationController? .popViewController (hareketli: gerçek)
valexa

19

bunu yaparsanız konsolda println mesajı alamayabilirsiniz,

@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/… . Herhangi bir Yardım, lütfen? Ben hala çözüm bulamıyorum o kadar uzun süre sıkışmış
Thiha Aung

14

Swift 3.0 ila 4.0'da bunu işlevinize yazmak kadar kolaydır:

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

Veya bir navigasyon denetleyicisindeyseniz "pop" yapabilirsiniz:

self.navigationController?.popViewController(animated: true)

pushViewController kullanıyorum çünkü çalışmıyor. Sadece self.navigationController? .PopViewController (animated: true) çalışıyor.
iOS

13
  1. Kapatmak istediğiniz Görünümü bir NavigationController'a gömün
  2. Tanımlayıcı olarak "Bitti" ifadesine sahip bir BarButton ekleyin
  3. Tamam düğmesi seçiliyken Yardımcı Editör'ü çağırın
  4. bu düğme için bir IBAction oluştur
  5. bu satırı parantez içine ekleyin:

    self.dismissViewControllerAnimated(true, completion: nil)

13

kullanın:

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

onun yerine:

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

1
ekle ! Denetleyiciye ve bu benim için çalışıyor
Jason G

1
@naturalc: navigationController sıfırsa ve koyarsanız, uygulamanın
çökeceğini unutmayın

8

Gezinti Denetleyicisi olmayan bir denetleyici sunuyorsanız, sunulan denetleyicinin yönteminden aşağıdaki kodu çağırabilirsiniz.

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

ViewController'ınız kalıcı olarak sunulursa, isteğe bağlı presentViewController sıfır olmaz ve kod yürütülür.


günümü kurtardın.
Shanu Singh

6

Deneyimlerime dayanarak, beni UIViewController uzantısı olarak kapatmak için bir yöntem eklemek:

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

Sonra herhangi bir UIViewControlleralt sınıfta görünüm denetleyicisini kapatmak için bu yöntemi çağırıyorum . Örneğin, iptal eyleminde:

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

6

Apple belgelerinden :

Sunulan görünüm denetleyicisi, sunduğu görünüm denetleyicisini kapatmaktan sorumludur

Bu nedenle, işten çıkarma yöntemini kendisinden çağırmak kötü bir uygulamadır .

Kipli sunuyorsanız ne yapmalısınız:

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

4

İptal veya Bitti'den diğer VC'ye herhangi bir selam oluşturmayın ve bu kodu yalnızca düğmelerinize yazın @IBAction

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

3

Mevcut görünüm denetleyicisini kapatmanın ve önceki görünüm denetleyicisine geri dönmenin tek yolu. Bunu yalnızca Storyboard ile yapabilirsiniz.

  1. Film Şeridini Aç
  2. İptal düğmesine sağ tıklayın ve önceki denetleyiciye geri taşımak istediğiniz önceki görünüm denetleyicisine sürükleyin
  3. Şimdi sağ tıklamayı bırakın ve iptal düğmesinde gerçekleştirilen bazı işlemleri görebilirsiniz
  4. Şimdi listeden "popover present" seçeneğini seçin
  5. Şimdi iptal düğmesine tıklayarak mevcut görünümünüzü kapatabilirsiniz

Lütfen bunu dene, Benimle çalışıyor.

İkinci Yol - Kullanım - navigationController.popViewControllerAnimated(true)

İyi şanslar..


stackoverflow.com/questions/30840235/… . Herhangi bir Yardım, lütfen? Ben hala çözüm bulamıyorum o kadar uzun süre sıkışmış
Thiha Aung

3
Bu yanlış. Bunun yerine, geçerli görünümün üstünde yeni bir görünüm denetleyicisi sunarak bellek sızıntısına neden olan görünümü hiçbir zaman kapatmazsınız. Bu, büyük olasılıkla uygulamanızın uygulama mağazasından reddedilmesini sağlar.
3366784

2

Başvuru için, yanlış görünüm denetleyicisini kapatıyor olabileceğinizi unutmayın. Örneğin, başka bir modun üstünde bir uyarı kutusu veya modunuz varsa. (Örneğin, geçerli modsal uyarınızın üstünde gösterilen bir Twitter yayın uyarısı olabilir). Bu durumda, iki kez işten çıkarmayı çağırmanız veya bir gevşeme segue kullanmanız gerekir.


1

Bir ViewController'ı kalıcı olarak sunuyorsanız ve kök ViewController'a geri dönmek istiyorsanız, kök ViewController'a geri dönmeden önce bu modally olarak sunulan ViewController'ı kapatmaya dikkat edin, aksi takdirde bu ViewController Bellekten kaldırılmaz ve Bellek sızıntılarına neden olmaz.


1

Swift 3.0'da

Sunulan bir görünüm denetleyicisini kapatmak istiyorsanız

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

1

Swift 4.1 ve Xcode 9.4.1'de

Yeni görünüm denetleyicisi sunmak için pushViewController kullanıyorsanız, bunu kullanın

self.navigationController?.popViewController(animated: false)

Başka bir kopya yapıştır yanıtı
J. Doe

1

Bunu dene:

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

"DismissViewController" olarak adlandırılan yöntem, sadece önceki görünümü için animasyonlu kapatmak gibi olacağını düşünüyorum tek bir parametre alır, bu en basit çözümdür.
cassiodiego

0

Bu kodu kapatmak için düğme eyleminde yazılmış

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

1
Bu kod snippet'i soruyu çözebilir, ancak bir açıklama dahil olmak , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın.
DimaSan


0

Üst VC'de mevcut yöntemi kullanıyorsanız, bu işlevi çağırmalısınız, alt VC'yi kapatmak için bunu kullanın

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

alt VC'yi push yöntemini kullanarak çağırıyorsanız, alt VC'yi kapatmak için bunu kullanın

self.navigationController?.popViewController(animated: true)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.