Saya punya pertanyaan teoretis. Sekarang, saya sedang membaca panduan ViewController Apple .
Mereka menulis:
Ketika tiba saatnya untuk menutup pengontrol tampilan yang disajikan, pendekatan yang disukai adalah membiarkan pengontrol tampilan yang menyajikan menutupnya. Dengan kata lain, jika memungkinkan, pengontrol tampilan yang sama yang menampilkan pengontrol tampilan juga harus bertanggung jawab untuk menutupnya. Meskipun ada beberapa teknik untuk memberi tahu pengontrol tampilan penyajian bahwa pengontrol tampilan yang disajikan harus ditutup, teknik yang disukai adalah pendelegasian.
Tapi saya tidak bisa menjelaskan, mengapa saya harus membuat protokol dalam VC yang disajikan dan menambahkan variabel delegasi, membuat metode delegasi dalam menyajikan VC untuk menolak VC yang disajikan, alih-alih panggilan sederhana dalam metode pengontrol tampilan yang disajikan
[self dismissViewControllerAnimated:NO completion:nil]
?
Mengapa pilihan pertama lebih baik? Mengapa Apple merekomendasikannya?
sumber
presentingViewController
sebagian besar tidak berguna karena akan merujuk keUINavigationController
jikaself
tertanam di dalamnya . Dalam hal ini, Anda tidak akan bisa mendapatkanpresentingViewController
sama sekali. Namun,[self dismissViewControllerAnimated:completion]
masih berfungsi dalam kasus itu. Saran saya adalah terus menggunakannya sampai Apple memperbaikinya.Diperbarui untuk Swift 3
Saya datang ke sini hanya ingin mengabaikan View Controller saat ini (disajikan). Saya membuat jawaban ini untuk siapa pun yang datang ke sini dengan tujuan yang sama.
Pengontrol Navigasi
Jika Anda menggunakan pengontrol navigasi, maka ini cukup mudah.
Kembali ke pengontrol tampilan sebelumnya:
Kembali ke pengontrol tampilan root:
(Berkat jawaban ini untuk Objective-C.)
Modal View Controller
Saat Pengontrol Tampilan disajikan secara sederhana, Anda dapat menutupnya (dari pengontrol tampilan kedua) dengan memanggil
The dokumentasi mengatakan,
Jadi berfungsi untuk pengontrol tampilan yang disajikan untuk memanggilnya sendiri. Berikut contoh lengkapnya.
Delegasi
Pertanyaan OP adalah tentang kompleksitas penggunaan delegasi untuk menolak pandangan.
Untuk titik ini saya tidak perlu menggunakan delegasi karena saya biasanya memiliki pengontrol navigasi atau pengontrol tampilan modal, tetapi jika saya perlu menggunakan pola delegasi di masa mendatang, saya akan menambahkan pembaruan.
sumber
Ini untuk penggunaan kembali pengontrol tampilan.
Pengontrol tampilan Anda seharusnya tidak peduli jika itu disajikan sebagai modal, didorong pada pengontrol navigasi, atau apa pun. Jika pengontrol tampilan Anda menutup sendiri, Anda menganggapnya disajikan secara sederhana. Anda tidak akan dapat mendorong pengontrol tampilan tersebut ke pengontrol navigasi.
Dengan mengimplementasikan protokol, Anda membiarkan pengontrol tampilan induk memutuskan bagaimana protokol harus disajikan / didorong dan ditutup / dimunculkan.
sumber
coba ini:
sumber
Dalam pengalaman saya, ini berguna saat Anda perlu menutupnya dari ViewController mana pun yang Anda inginkan dan melakukan tugas berbeda untuk setiap viewcontroller yang menutupnya. Semua viewController yang mengadopsi protokol dapat menutup tampilan dengan caranya sendiri. (ipad vs iphone, atau meneruskan data yang berbeda saat menutup dari tampilan yang berbeda, memanggil metode yang berbeda saat menutup, dll ..)
Edit:
Jadi, untuk memperjelas, jika yang ingin Anda lakukan hanyalah mengabaikan tampilan, saya lihat tidak perlu menyiapkan protokol delegasi. Jika Anda perlu melakukan hal yang berbeda setelah Anda menutupnya dari pengontrol tampilan penyajian yang berbeda, Ini akan menjadi cara terbaik Anda untuk menggunakan delegasi.
sumber
Kutipan dari Panduan Pemrograman Pengontrol Tampilan , "Bagaimana Pengontrol Tampilan Menampilkan Pengontrol Tampilan Lain".
Jadi di satu sisi itu membuat desain seimbang yang bagus, pelepasan yang baik, dll. Tapi di sisi lain itu sangat praktis, karena Anda dapat dengan cepat kembali ke titik tertentu dalam navigasi.
Meskipun, saya pribadi lebih suka menggunakan segue yang tidak berliku daripada mencoba menelusuri mundur pohon pengontrol tampilan yang ditampilkan, yang dibicarakan Apple dalam bab ini dari mana kutipan tersebut berasal.
sumber
Satu poin adalah bahwa ini adalah pendekatan pengkodean yang baik. Ini memenuhi banyak
OOP
prinsip, misalnya, SRP, Pemisahan kekhawatiran, dll.Jadi, pengontrol tampilan yang menyajikan tampilan harus menjadi orang yang mengabaikannya.
Seperti, perusahaan real estat yang menyewakan rumah harus diberi wewenang untuk mengambilnya kembali.
sumber
Swift 3.0 // Singkirkan Pengontrol Tampilan dengan cepat
sumber
Selain jawaban Michael Enriquez, saya dapat memikirkan satu alasan lain mengapa ini mungkin cara yang baik untuk melindungi diri Anda dari keadaan yang tidak dapat ditentukan:
Katakanlah ViewControllerA menyajikan ViewControllerB secara sederhana. Namun, karena Anda mungkin belum menulis kode untuk ViewControllerA, Anda tidak mengetahui siklus hidup ViewControllerA. Ini mungkin menutup 5 detik (katakanlah) setelah menampilkan pengontrol tampilan Anda, ViewControllerB.
Dalam kasus ini, jika Anda hanya menggunakan
dismissViewController
dari ViewControllerB untuk menutupnya sendiri, Anda akan berakhir dalam keadaan tidak ditentukan - mungkin bukan crash atau layar hitam, tetapi keadaan tidak ditentukan dari sudut pandang Anda.Sebaliknya, jika Anda menggunakan pola delegasi, Anda akan mengetahui status ViewControllerB dan Anda dapat memprogram untuk kasus seperti yang saya jelaskan.
sumber
Cepat
sumber
Jika Anda menggunakan tampilan penggunaan modal, tutup.
sumber
Ini banyak omong kosong. Pendelegasian baik-baik saja jika diperlukan tetapi jika itu membuat kode lebih kompleks - dan memang demikian - maka perlu ada alasan untuk itu.
Saya yakin Apple punya alasannya sendiri. Tetapi lebih jelas dan lebih ringkas untuk hanya meminta VC yang disajikan melakukan pemecatan kecuali ada alasan yang benar untuk melakukan sebaliknya dan tidak ada seorang pun di sini hingga hari ini yang telah menyajikan yang dapat saya lihat.
Protokol sangat baik saat dibutuhkan tetapi desain berorientasi objek tidak pernah tentang memiliki modul yang saling berkomunikasi secara tidak perlu.
Tom Love (salah satu pengembang Objective C) pernah berkomentar bahwa Objective C "elegan", "kecil", "tajam" dan "terdefinisi dengan baik" (bila dibandingkan dengan C ++). Mudah baginya untuk mengatakannya. Delegasi adalah fitur berguna yang tampaknya telah digunakan secara berlebihan "hanya karena", dan sementara saya suka bekerja dalam bahasa tersebut, saya takut gagasan felling terpaksa menggunakan sintaks yang tidak perlu untuk membuat segalanya lebih kompleks daripada yang seharusnya.
sumber
Anda dapat Menutup jendela tampilan super Anda
self.view.superview?.window?.close()
sumber