Saya tentang membuat aplikasi menggunakan UINavigationController
untuk menyajikan pengontrol tampilan berikutnya. Dengan iOS5 ada metode baru untuk mempresentasikan UIViewControllers
:
presentViewController:animated:completion:
Sekarang saya bertanya mengapa tidak ada penangan penyelesaian untuk UINavigationController
? Hanya ada
pushViewController:animated:
Apakah mungkin untuk membuat penangan penyelesaian saya sendiri seperti yang baru presentViewController:animated:completion:
?
viewDidAppear:animated:
memungkinkan Anda mengeksekusi kode setiap kali pengontrol tampilan Anda muncul di layar (viewDidLoad
hanya saat pengontrol tampilan Anda dimuat pertama kali)-(void)viewDidAppear:(BOOL)animated
Jawaban:
Lihat jawaban par untuk solusi lain yang lebih mutakhir
UINavigationController
animasi dijalankan denganCoreAnimation
, jadi masuk akal untuk merangkum kode di dalamnyaCATransaction
dan dengan demikian menetapkan blok penyelesaian.Swift :
Untuk cepat saya sarankan membuat ekstensi seperti itu
Pemakaian:
Objective-C
Header:
Penerapan:
sumber
pushViewController:animated:
ataupopViewController:animated
, panggilanviewDidLoad
danviewDidAppear
terjadi dalam siklus runloop berikutnya. Jadi kesan saya adalah bahwa meskipun metode tersebut memang memanggil animasi, mereka tidak akan menjadi bagian dari transaksi yang disediakan dalam contoh kode. Apakah itu yang menjadi perhatian Anda? Karena solusi ini sangat sederhana.didShowViewController
sekalipun. Sementara solusi ini sangat sederhana, saya akan mempertanyakan "bukti masa depan". Terutama mengingat perubahan untuk melihat callback siklus hidup yang disertakan dengan ios7 / 8iOS 7+ Swift
Cepat 4:
EDIT: Saya telah menambahkan versi Swift 3 dari jawaban asli saya. Dalam versi ini saya telah menghapus contoh co-animasi yang ditampilkan di versi Swift 2 karena tampaknya telah membingungkan banyak orang.
Cepat 3:
Cepat 2:
sumber
nil
sebagai blok animasi.nil
adalah hal yang sangat valid untuk dilakukan juga.transitionCoordinator
is nihil?transitionCoordinator
maka kemungkinan Anda memanggil fungsi ini terlalu dini dalam siklus hidup pengontrol navigasi. Tunggu setidaknya hinggaviewWillAppear()
dipanggil sebelum mencoba mendorong pengontrol tampilan dengan animasi.Berdasarkan jawaban par (yang merupakan satu-satunya yang bekerja dengan iOS9), tetapi lebih sederhana dan tanpa hal lain (yang bisa menyebabkan penyelesaian tidak pernah dipanggil):
sumber
Saat
UINavigationController
ini tidak mendukung ini. Tapi adaUINavigationControllerDelegate
yang bisa Anda gunakan.Cara mudah untuk melakukannya adalah dengan membuat subclass
UINavigationController
dan menambahkan properti blok penyelesaian:Sebelum mendorong pengontrol tampilan baru, Anda harus mengatur blok penyelesaian:
Subclass baru ini dapat ditetapkan di Interface Builder atau digunakan secara terprogram seperti ini:
sumber
pushViewController:animated:completion:
akan membuat ini menjadi solusi yang elegan.Ini adalah versi Swift 4 dengan Pop.
Kalau-kalau ada orang lain yang membutuhkan ini.
sumber
Untuk memperluas jawaban @Klaas (dan sebagai hasil dari pertanyaan ini ) saya telah menambahkan blok penyelesaian langsung ke metode push:
Untuk digunakan sebagai berikut:
sumber
if... (self.pushedVC == viewController) {
salah. Anda perlu menguji kesetaraan antar objek dengan menggunakanisEqual:
, yaitu,[self.pushedVC isEqual:viewController]
isEqual
mungkin akan lebih benar secara teknis jika mereka pernah melakukannya.Sejak iOS 7.0, Anda dapat menggunakan
UIViewControllerTransitionCoordinator
untuk menambahkan blok penyelesaian push:sumber
Swift 2.0
sumber
Diperlukan lebih banyak proses untuk menambahkan perilaku ini dan mempertahankan kemampuan untuk menetapkan delegasi eksternal.
Berikut adalah implementasi terdokumentasi yang mempertahankan fungsionalitas delegasi:
LBXCompletingNavigationController
sumber