Bagaimana cara mengabaikan ViewController di Swift?


213

Saya mencoba untuk mengabaikan ViewController dengan cepat dengan memanggil dismissViewControllersebuahIBAction

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

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

gambar acak segue

Saya bisa melihat pesan println di output konsol tetapi ViewController tidak pernah diberhentikan. Apa yang bisa menjadi masalah?


2
Bagaimana Anda menampilkan pengontrol tampilan?
dasdom

Saya melakukan pemetaan dengan mengatur segue - "show", lihat screenshot yang terlampir.
rshankar

4
Cobalah menggunakan modal. Jika Anda menggunakan push, Anda harus mengabaikannya dengan metode pop pengontrol navigasi.
dasdom

Jawaban:


414

Dari gambar Anda sepertinya Anda mempresentasikan ViewController menggunakan push

Ini dismissViewControllerAnimateddigunakan untuk menutup ViewControllers yang disajikan menggunakan modal

Cepat 2

navigationController.popViewControllerAnimated(true)

Cepat 4

navigationController?.popViewController(animated: true)

dismiss(animated: true, completion: nil)

6
Bagaimana Anda melakukannya untuk segue 'Show Detail'?
MoralCode

2
Untuk Swift 2.2 navigationController! .PopViewControllerDirkirakan (benar)
swiftBoy

7
Untuk Swift 3 navigationController! .PopViewController (animasi: true)
Alex Trott

174

Saya punya solusi untuk masalah Anda. Silakan coba kode ini untuk mengabaikan pengontrol tampilan jika Anda menyajikan tampilan menggunakan modal:

Swift 3:

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

ATAU

Jika Anda menyajikan tampilan menggunakan segue "push"

self.navigationController?.popViewController(animated: true)

1
Terima kasih, tetapi masih hasilnya sama, tidak mengabaikan ViewController
rshankar

4
Apa bedanya dengan metode yang digunakan OP?
dasdom

30
Percakapan tidak berguna jika Anda tidak bereaksi terhadap pertanyaan saya.
dasdom

_ = self.navigationController? .popViewController (animasi: true)
valexa

19

jika Anda melakukan ini saya kira Anda mungkin tidak mendapatkan pesan println di konsol,

@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/… . Tolong Tolong, Tolong. Saya terjebak pada hal itu sejak lama yang masih tidak dapat menemukan solusi
Thiha Aung

14

Di Swift 3.0 hingga 4.0, semudah mengetikkan ini ke fungsi Anda:

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

Atau jika Anda menggunakan pengontrol navigasi, Anda dapat "pop" itu:

self.navigationController?.popViewController(animated: true)

Abaikan tidak bekerja, karena saya menggunakan pushViewController. Hanya self.navigationController? .PopViewController (animasi: true) yang berfungsi.
iOS

13
  1. sematkan Tampilan yang ingin Anda abaikan di NavigationController
  2. tambahkan BarButton dengan "Done" sebagai Identifier
  3. aktifkan Asisten Editor dengan tombol Selesai dipilih
  4. buat IBAction untuk tombol ini
  5. tambahkan baris ini ke dalam kurung:

    self.dismissViewControllerAnimated(true, completion: nil)

12

Menggunakan:

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

dari pada:

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

1
tambah sebuah ! ke navigationController dan bekerja untuk saya
Jason G

1
@naturalc: Perlu diketahui bahwa jika navigationController tidak ada dan Anda masukkan !, aplikasi akan macet
jobima

8

Jika Anda menampilkan pengontrol tanpa Pengontrol Navigasi, Anda dapat memanggil kode berikut dari metode pengontrol yang disajikan.

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

Jika ViewController Anda disajikan secara moderat, presentingViewController opsional tidak akan nol dan kode akan dieksekusi.


kamu menyelamatkan hariku.
Shanu Singh

6

Berdasarkan pengalaman saya, saya menambahkan metode untuk mengabaikan saya sebagai ekstensi untuk UIViewController:

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

Lalu saya memanggil metode ini untuk mengabaikan view controller di sembarang UIViewControllersubclass. Misalnya, dalam tindakan pembatalan:

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

6

Dari dokumentasi Apple :

Pengontrol tampilan tampilan bertanggung jawab untuk mengabaikan pengontrol tampilan yang disajikan

Dengan demikian, itu adalah praktik yang buruk untuk hanya meminta metode pemberhentian dari itu sendiri.

Apa yang harus Anda lakukan jika Anda menyajikannya adalah:

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

4

Jangan membuat segmen apa pun dari Batalkan atau Selesai ke VC lain dan hanya tulis kode ini tombol Anda @IBAction

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

3

Ini adalah salah satu cara untuk menghilangkan pengontrol tampilan sekarang dan kembali ke pengontrol tampilan sebelumnya. Anda dapat melakukan ini hanya melalui Storyboard.

  1. Buka Storyboard
  2. Klik kanan pada tombol Cancel dan seret ke pengontrol tampilan sebelumnya, di mana Anda ingin kembali ke pengontrol sebelumnya
  3. Sekarang lepaskan klik kanan dan Anda dapat melihat beberapa tindakan yang dilakukan pada tombol batal
  4. Sekarang pilih opsi "popover present" dari daftar
  5. Sekarang Anda dapat mengabaikan tampilan Anda saat ini dengan mengklik tombol batal

Silakan coba ini, Ini bekerja dengan saya.

Second Way - Gunakan - navigationController.popViewControllerAnimated(true)

Semoga berhasil ..


stackoverflow.com/questions/30840235/… . Tolong Tolong, Tolong. Saya terjebak pada hal itu sejak lama yang masih tidak dapat menemukan solusi
Thiha Aung

3
Ini salah. Anda tidak pernah mengabaikan tampilan yang Anda tunjukkan sebagai pengontrol tampilan baru di atas yang sekarang, menyebabkan kebocoran memori. Ini kemungkinan besar akan membuat aplikasi Anda ditolak dari app store.
3366784

2

Untuk referensi, perlu diketahui bahwa Anda mungkin mengabaikan pengontrol tampilan yang salah. Misalnya, jika Anda memiliki kotak peringatan atau modal yang ditampilkan di atas modal lain. (Misalnya, Anda dapat memasang lansiran pos Twitter di atas lansiran modal saat ini). Dalam hal ini, Anda perlu menelepon pemberhentian dua kali, atau menggunakan segue bersantai.


1

Jika Anda menghadirkan ViewController secara modal, dan ingin kembali ke root ViewController, berhati-hatilah untuk mengabaikan ViewController yang disajikan secara modern ini sebelum Anda kembali ke root ViewController jika tidak ViewController ini tidak akan dihapus dari Memori dan menyebabkan kebocoran Memori.


1

Di Swift 3.0

Jika Anda ingin mengabaikan pengontrol tampilan yang disajikan

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

1

Dalam Swift 4.1 dan Xcode 9.4.1

Jika Anda menggunakan pushViewController untuk menyajikan pengontrol tampilan baru, gunakan ini

self.navigationController?.popViewController(animated: false)

Satu lagi jawaban tempelkan
J. Doe

1

Coba ini:

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

Metode yang disebut "dismissViewController" hanya membutuhkan satu parameter tunggal, yang saya kira akan terlihat seperti mengabaikan animasi ke tampilan sebelumnya, ini adalah solusi paling sederhana.
cassiodiego

0

Kode ini ditulis dalam aksi tombol untuk mengabaikan

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

1
Sementara potongan kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda.
DimaSan


0

Jika Anda menggunakan metode ini dalam VC induk maka Anda harus memanggil fungsi ini, untuk mengabaikan VC anak gunakan ini

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

jika Anda memanggil VC anak dengan menggunakan metode push, untuk mengabaikan VC anak gunakan ini

self.navigationController?.popViewController(animated: true)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.