Bisakah Anda menjelaskan kepada saya cara yang benar untuk mengelola UIViewController
siklus hidup?
Secara khusus, saya ingin tahu bagaimana menggunakan Initialize
, ViewDidLoad
, ViewWillAppear
, ViewDidAppear
, ViewWillDisappear
, ViewDidDisappear
, ViewDidUnload
dan Dispose
metode dalam Mono Sentuh untuk UIViewController
kelas.
ios
uiviewcontroller
xamarin.ios
lifecycle
Lorenzo B
sumber
sumber
Jawaban:
Semua perintah ini dipanggil secara otomatis pada waktu yang tepat oleh iOS ketika Anda memuat / menyajikan / menyembunyikan pengontrol tampilan. Penting untuk dicatat bahwa metode ini melekat
UIViewController
dan bukan untukUIView
diri mereka sendiri. Anda tidak akan mendapatkan salah satu fitur ini hanya dengan menggunakan aUIView
.Ada dokumentasi bagus di situs Apple di sini . Memasukkan secara sederhana:
ViewDidLoad
- Dipanggil saat Anda membuat kelas dan memuat dari xib. Bagus untuk pengaturan awal dan hanya bekerja satu kali saja.ViewWillAppear
- Dipanggil tepat sebelum tampilan Anda muncul, bagus untuk menyembunyikan / menampilkan bidang atau operasi apa pun yang Anda inginkan terjadi setiap kali sebelum tampilan terlihat. Karena Anda mungkin bolak-balik di antara tampilan, ini akan dipanggil setiap kali tampilan Anda akan muncul di layar.ViewDidAppear
- Dipanggil setelah tampilan muncul - tempat yang bagus untuk memulai animasi atau memuat data eksternal dari API.ViewWillDisappear
/DidDisappear
- Ide yang sama denganViewWillAppear
/ViewDidAppear
.ViewDidUnload
/ViewDidDispose
- Di Objective-C, ini adalah tempat Anda melakukan pembersihan dan pelepasan barang, tetapi ini ditangani secara otomatis sehingga tidak banyak yang benar-benar perlu Anda lakukan di sini.sumber
PEMBARUAN: ViewDidUnload sudah tidak digunakan lagi di iOS 6, jadi perbarui jawabannya.
Daur hidup UIViewController digambarkan di sini:
Keuntungan menggunakan Xamarin Native / Mono Touch, adalah ia menggunakan API asli, dan karena itu mengikuti siklus hidup ViewController yang sama seperti yang Anda temukan di Dokumentasi Apple.
sumber
Ini untuk Versi iOS terbaru (Dimodifikasi dengan Xcode 9.3, Swift 4.1 ). Di bawah ini adalah semua tahapan yang membuat siklus hidup menjadi
UIViewController
lengkap.loadView()
loadViewIfNeeded()
viewDidLoad()
viewWillAppear(_ animated: Bool)
viewWillLayoutSubviews()
viewDidLayoutSubviews()
viewDidAppear(_ animated: Bool)
viewWillDisappear(_ animated: Bool)
viewDidDisappear(_ animated: Bool)
Izinkan saya menjelaskan semua tahapan itu.
1.
loadView
Acara ini membuat / memuat tampilan yang dikendalikan pengontrol. Itu dapat memuat dari file nib terkait atau kosong
UIView
jika null ditemukan. Ini menjadikannya tempat yang bagus untuk membuat tampilan Anda dalam kode secara terprogram.2.
loadViewIfNeeded
Jika memunculkan pandangan saat
viewController
ini belum ditetapkan maka metode ini akan memuat tampilan tetapi ingat, ini hanya tersedia di iOS> = 9.0. Jadi, jika Anda mendukung iOS <9.0 maka jangan berharap itu masuk ke dalam gambar.3.
viewDidLoad
The
viewDidLoad
event hanya disebut ketika tampilan dibuat dan dimuat ke memori tapi batas untuk pandangan tidak didefinisikan belum. Ini adalah tempat yang baik untuk menginisialisasi objek yang akan digunakan pengontrol tampilan.4.
viewWillAppear
Acara ini memberi tahu
viewController
kapan saja tampilan muncul di layar. Pada langkah ini tampilan memiliki batas yang ditentukan tetapi orientasi tidak diatur.5.
viewWillLayoutSubviews
Ini adalah langkah pertama dalam siklus hidup tempat batas diselesaikan. Jika Anda tidak menggunakan kendala atau Tata Letak Otomatis, Anda mungkin ingin memperbarui subview di sini. Ini hanya tersedia di iOS> = 5.0. Jadi jika Anda mendukung iOS <5.0 maka jangan berharap itu masuk ke dalam gambar.
6.
viewDidLayoutSubviews
Acara ini memberi tahu pengontrol tampilan bahwa subview telah disiapkan. Ini adalah tempat yang bagus untuk membuat perubahan pada subview setelah ditetapkan. Ini hanya tersedia di iOS> = 5.0. Jadi jika Anda mendukung iOS <5.0 maka jangan berharap itu masuk ke dalam gambar.
7.
viewDidAppear
The
viewDidAppear
peristiwa kebakaran setelah pandangan disajikan di layar. Yang menjadikannya tempat yang baik untuk mendapatkan data dari layanan backend atau database.8.
viewWillDisappear
The
viewWillDisappear
peristiwa kebakaran ketika pandangan yang disajikanviewController
adalah tentang menghilang, mengabaikan, menutupi atau menyembunyikan belakang lainnyaviewController
. Ini adalah tempat yang baik di mana Anda dapat membatasi panggilan jaringan Anda, membatalkan timer atau melepaskan objek yang terikat ituviewController
.9.
viewDidDisappear
Ini adalah langkah terakhir dari siklus hidup yang dapat diatasi oleh siapa saja karena peristiwa ini terjadi segera setelah tampilan yang disajikan
viewController
telah hilang, diberhentikan, ditutupi atau disembunyikan.Sekarang sesuai Apple ketika Anda menerapkan metode ini, Anda harus ingat untuk memanggil
super
implementasi metode tertentu.Semoga ini bisa membantu. Terima kasih.
UPDATE - Seperti @ThomasW menunjuk ke dalam komentar
viewWillLayoutSubviews
danviewDidLayoutSubviews
juga akan dipanggil pada waktu lain ketika subview dari tampilan utama dimuat, misalnya ketika sel-sel tampilan tabel atau tampilan koleksi dimuat.UPDATE - Seperti @Maria menunjuk ke dalam komentar, deskripsi
loadView
telah diperbaruisumber
viewWillLayoutSubviews
danviewDidLayoutSubviews
juga akan dipanggil pada waktu lain ketika subview tampilan utama dimuat, misalnya ketika sel-sel tampilan tabel atau tampilan koleksi dimuat.viewWillAppear
viewDidAppear
viewDidDisappear
. Anda harus menelepon super di beberapa titik.iOS 10,11 (Swift 3.1, Swift 4.0)
Menurut
UIViewController
diUIKit
pengembang,1. loadView ()
Di sinilah subclass harus membuat hierarki tampilan khusus mereka jika mereka tidak menggunakan nib . Seharusnya tidak pernah dipanggil secara langsung.
2. loadViewIfNeeded ()
Memuat tampilan pengontrol tampilan jika belum ditetapkan.
3. viewDidLoad ()
Dipanggil setelah tampilan dimuat. Untuk pengontrol tampilan yang dibuat dalam kode, ini adalah setelah-loadView. Untuk pengontrol tampilan yang tidak diarsipkan dari nib, ini setelah tampilan ditetapkan.
4. viewWillAppear (_ animated: Bool)
Dipanggil saat tampilan hendak dibuat terlihat. Default tidak melakukan apa-apa
5. viewWillLayoutSubviews ()
Disebut tepat sebelum metode layoutSubviews tampilan view controller dipanggil. Subkelas dapat diimplementasikan seperlunya. Default tidak melakukan apa-apa.
6. viewDidLayoutSubviews ()
Disebut tepat setelah metode layoutSubviews tampilan view controller dipanggil. Subkelas dapat diimplementasikan seperlunya. Default tidak melakukan apa-apa.
7. viewDidAppear (_ animated: Bool)
Disebut ketika tampilan telah sepenuhnya dialihkan ke layar. Default tidak melakukan apa-apa
8. viewWillDisappear (_ animated: Bool)
Disebut ketika tampilan ditolak, ditutupi atau disembunyikan. Default tidak melakukan apa-apa
9. viewDidDisappear (_ animated: Bool )
Dipanggil setelah pandangan ditolak, ditutupi atau disembunyikan. Default tidak melakukan apa-apa
10. viewWillTransition (untuk ukuran: CGSize, dengan koordinator: UIViewControllerTransitionCoordinator)
Disebut ketika tampilan Transisi.
11. willMove (induk toParentViewController: UIViewController?)
12. didMove (induk toParentViewController: UIViewController?)
Kedua metode ini bersifat publik untuk subclass kontainer yang akan dipanggil saat transisi antara pengontrol anak. Jika ditimpa, penggantian harus memastikan untuk memanggil super.
Argumen induk dalam kedua metode ini adalah nol ketika seorang anak dikeluarkan dari induknya; selain itu sama dengan controller tampilan induk baru.
13. didReceiveMemoryWarning ()
Disebut ketika aplikasi induk menerima peringatan memori. Di iOS 6.0 tidak akan menghapus tampilan secara default.
sumber
nib
disebutkan di bawah iniloadView
?viewWillLayoutSubviews()
dipanggil sebelum objek tampilan ViewController memanggillayoutSubviews()
metodenyaMulai dari iOS 6 dan selanjutnya. Diagram baru adalah sebagai berikut:
sumber
Mari kita berkonsentrasi pada metode, yang bertanggung jawab atas siklus hidup UIViewController :
Penciptaan:
- (void)init
- (void)initWithNibName:
Lihat pembuatan:
- (BOOL)isViewLoaded
- (void)loadView
- (void)viewDidLoad
- (UIView *)initWithFrame:(CGRect)frame
- (UIView *)initWithCoder:(NSCoder *)coder
Penanganan perubahan kondisi tampilan:
- (void)viewDidLoad
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated
- (void)viewWillDisappear:(BOOL)animated
- (void)viewDidDisappear:(BOOL)animated
- (void)viewDidUnload
Penanganan peringatan memori:
- (void)didReceiveMemoryWarning
Deallokasi
- (void)viewDidUnload
- (void)dealloc
Untuk informasi lebih lanjut silakan lihat Referensi Kelas UIViewController .
sumber
Metode
viewWillLayoutSubviews
danviewDidLayoutSubviews
tidak disebutkan dalam diagram, tetapi ini disebut antaraviewWillAppear
danviewDidAppear
. Mereka dapat dipanggil beberapa kali.sumber
Jawaban Haider benar untuk pra-iOS 6. Namun, pada iOS 6 viewDidUnload dan viewWillUnload tidak pernah dipanggil. The docs negara: "Tampilan tidak lagi dibersihkan dalam kondisi rendah memori dan jadi metode ini tidak pernah disebut."
sumber
Ada banyak informasi yang ketinggalan zaman dan tidak lengkap di sini. Hanya untuk iOS 6 dan yang lebih baru:
loadView
[Sebuah]viewDidLoad
[Sebuah]viewWillAppear
viewWillLayoutSubviews
adalah batas waktu pertama kali diselesaikanviewDidLayoutSubviews
viewDidAppear
*
viewWillLayoutSubviews
[b]*
viewDidLayoutSubviews
[b]Catatan kaki:
(a) - Jika Anda secara manual menghilangkan tampilan selama
didReceiveMemoryWarning
,loadView
danviewDidLoad
akan dipanggil lagi. Yaitu, secara defaultloadView
danviewDidLoad
hanya dipanggil sekali per instance controller tampilan.(B) Dapat disebut 0 kali tambahan atau lebih.
sumber
viewWillLayoutSubviews
danviewDidLayoutSubviews
juga akan dipanggil pada waktu lain ketika subview tampilan utama dimuat, misalnya ketika sel-sel tampilan tabel atau tampilan koleksi dimuat.Menjelaskan Transisi Negara dalam dokumen resmi: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/index.html
Gambar ini menunjukkan transisi status yang valid antara berbagai metode panggilan balik 'akan' dan 'memang'
Transisi Negara yang Valid:
Diambil dari: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Art/UIViewController Class Reference_2x.png
sumber
Sesuai dokumen Apple - Mulai Kembangkan Aplikasi iOS (Swift) - Bekerja dengan View Controllers - Memahami Siklus Hidup View Controller
sumber