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?

rshankar
sumber
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)
Zoon Nooz
sumber
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)
satheesh
sumber
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")
  }    
}
BaSha
sumber
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)
Chase McElroy
sumber
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)
SENI LAOMUSIK
sumber
12

Menggunakan:

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

dari pada:

self.navigationController.dismissViewControllerAnimated(true, completion: nil)
jobima
sumber
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.

Peyotle
sumber
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)
   }
   ...
}
David.Chu.ca
sumber
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)
OhadM
sumber
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)
}
Fatih
sumber
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 ..

Chetan Bhalara
sumber
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.

mcfroob
sumber
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.

dan
sumber
1

Di Swift 3.0

Jika Anda ingin mengabaikan pengontrol tampilan yang disajikan

self.dismiss(animated: true, completion: nil)
Ramakrishna
sumber
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)
iOS
sumber
Satu lagi jawaban tempelkan
J. Doe
1

Coba ini:

@IBAction func close() {
  dismiss(animated: true, completion: nil)
}
cassiodiego
sumber
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)
  }
Sai kumar Reddy
sumber
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
@IBAction func back(_ sender: Any) {
        self.dismiss(animated: false, completion: nil)
    }
ind mohamed emam
sumber
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)
Фаррух Махмудов
sumber