Saat dismissViewController
menutup pengontrol tampilan modal menggunakan , ada opsi untuk menyediakan blok penyelesaian. Apakah ada persamaan yang serupa untuk popViewController
?
Argumen penyelesaian cukup berguna. Misalnya, saya dapat menggunakannya untuk menahan penghapusan baris dari tampilan tabel hingga modal dimatikan layar, membiarkan pengguna melihat animasi baris. Saat kembali dari pengontrol tampilan yang didorong, saya menginginkan kesempatan yang sama.
Saya telah mencoba menempatkan popViewController
di UIView
blok animasi, di mana saya memiliki akses ke blok penyelesaian. Namun, ini menghasilkan beberapa efek samping yang tidak diinginkan pada tampilan yang dimunculkan.
Jika metode seperti itu tidak tersedia, apa saja solusinya?
ios
cocoa-touch
uiview
uiviewcontroller
uiviewanimation
Ben Packard
sumber
sumber
Jawaban:
Saya tahu jawaban telah diterima lebih dari dua tahun lalu, namun jawaban ini tidak lengkap.
Ini benar secara teknis karena
UINavigationController
API tidak menawarkan opsi apa pun untuk ini. Namun dengan menggunakan kerangka kerja CoreAnimation, dimungkinkan untuk menambahkan blok penyelesaian ke animasi yang mendasarinya:Blok penyelesaian akan dipanggil segera setelah animasi digunakan oleh
popViewControllerAnimated:
akhir. Fungsionalitas ini telah tersedia sejak iOS 4.sumber
extension UINavigationController { func popViewControllerWithHandler(handler: ()->()) { CATransaction.begin() CATransaction.setCompletionBlock(handler) self.popViewControllerAnimated(true) CATransaction.commit() } }
Untuk iOS9 versi SWIFT - berfungsi seperti pesona (belum diuji untuk versi sebelumnya). Berdasarkan jawaban ini
sumber
Saya membuat
Swift
versi dengan ekstensi dengan jawaban @JorisKluivers .Ini akan memanggil penutupan penyelesaian setelah animasi selesai untuk
push
danpop
.sumber
popViewController
ataupushViewController
, tetapi jika Anda memeriksa apa topViewController tepat setelah itu, Anda akan melihat itu masih yang lama, sama sepertipop
ataupush
tidak pernah terjadi ...SWIFT 4.1
sumber
Saya memiliki masalah yang sama. Dan karena saya harus menggunakannya dalam beberapa kesempatan, dan dalam rantai blok penyelesaian, saya membuat solusi umum ini dalam subkelas UINavigationController:
Asumsi
dan
dan
sumber
Tidak ada cara untuk melakukan apa yang Anda inginkan di luar kotak. yaitu tidak ada metode dengan blok penyelesaian untuk memunculkan pengontrol tampilan dari tumpukan navigasi.
Apa yang akan saya lakukan adalah memasukkan logika
viewDidAppear
. Itu akan dipanggil setelah tampilan selesai muncul di layar. Ini akan dipanggil untuk semua skenario berbeda dari pengontrol tampilan yang muncul, tetapi itu seharusnya baik-baik saja.Atau Anda bisa menggunakan
UINavigationControllerDelegate
metode ininavigationController:didShowViewController:animated:
untuk melakukan hal serupa. Ini dipanggil saat pengontrol navigasi selesai mendorong atau memunculkan pengontrol tampilan.sumber
dismissViewController
. Mungkin itu akan terjadipopViewController
. Ajukan radar :-).-dismissViewController:animated:completionBlock:
, tetapi Anda bisa mendapatkan animasi melalui delegasi pengontrol navigasi. Setelah animasi selesai,-navigationController:didShowViewController:animated:
delegasi akan dipanggil dan Anda dapat melakukan apa pun yang Anda perlukan di sana.Bekerja dengan atau tanpa animasi dengan benar, dan juga termasuk
popToRootViewController
:sumber
completion()
async?completion
tidak pernah dijalankan pada runloop yang sama. jaminan inicompletion
tidak akan pernah berjalan di runloop yang sama saat tidak dianimasikan. lebih baik tidak memiliki ketidakkonsistenan seperti ini.Berdasarkan jawaban @ HotJard, saat yang Anda inginkan hanyalah beberapa baris kode. Cepat dan mudah.
Cepat 4 :
sumber
Untuk 2018 ...
jika Anda memiliki ini ...
dan Anda ingin menambahkan penyelesaian ...
sesederhana itu.
Tip praktis ...
Ini kesepakatan yang sama untuk
popToViewController
panggilan praktis .Hal yang khas adalah Anda memiliki tumpukan onboarding dari jutaan layar. Ketika akhirnya selesai, Anda kembali ke layar "dasar" Anda, dan akhirnya menjalankan aplikasi.
Jadi di layar "dasar", untuk "kembali",
popToViewController(self
sumber
Blok penyelesaian dipanggil setelah metode viewDidDisappear dipanggil pada pengontrol tampilan yang disajikan, Jadi, menempatkan kode dalam metode viewDidDisappear dari pengontrol tampilan yang muncul harus bekerja sama seperti blok penyelesaian.
sumber
Jawaban Swift 3, berkat jawaban ini: https://stackoverflow.com/a/28232570/3412567
sumber
Versi Swift 4 dengan parameter viewController opsional untuk dimunculkan ke versi tertentu.
sumber
Membersihkan versi Swift 4 berdasarkan jawaban ini .
sumber
Ada sebuah pod bernama UINavigationControllerWithCompletionBlock yang menambahkan dukungan untuk blok penyelesaian saat mendorong dan muncul pada UINavigationController.
sumber
2020 Swift 5.1 cara
Solusi ini menjamin bahwa penyelesaian dijalankan setelah popViewController selesai sepenuhnya. Anda bisa mengujinya dengan melakukan operasi lain pada NavigationController setelah selesai: Dalam semua solusi lain di atas UINavigationController masih sibuk dengan operasi popViewController dan tidak merespons.
sumber
Hanya untuk kelengkapan, saya telah membuat kategori Objective-C siap digunakan:
sumber
Saya mencapai hal ini dengan presisi menggunakan balok. Saya ingin pengontrol hasil yang saya ambil menunjukkan baris yang ditambahkan oleh tampilan modal, hanya setelah baris tersebut sepenuhnya meninggalkan layar, sehingga pengguna dapat melihat perubahan yang terjadi. Dalam mempersiapkan segue yang bertanggung jawab untuk menampilkan pengontrol tampilan modal, saya mengatur blok yang ingin saya jalankan ketika modal menghilang. Dan di pengontrol tampilan modal, saya menimpa viewDidDissapear dan kemudian memanggil blok. Saya hanya memulai pembaruan ketika modal akan muncul dan mengakhiri pembaruan ketika menghilang, tetapi itu karena saya menggunakan NSFetchedResultsController namun Anda dapat melakukan apa pun yang Anda suka di dalam blok.
sumber
Gunakan ekstensi berikutnya pada kode Anda: (Swift 4)
sumber