viewDidAppear adalah metode UIViewController yang dipanggil UIKit setelah layar sepenuhnya muncul di tampilan dan semua animasi transisi selesai. Menurut Apple Developer Documentation, metode ini menjamin bahwa View terlihat oleh pengguna dan siap untuk interaksi. viewDidAppear adalah tempat optimal untuk menjalankan animasi, pelacakan, dan operasi asinkron.
Poin Utama
viewDidAppear adalah metode UIViewController yang dipanggil UIKit setelah View ditambahkan ke hierarki jendela dan animasi transisi sepenuhnya selesai. Pada saat ini layar berada dalam keadaan akhir: terlihat, dapat berinteraksi dengannya, semua animasi UIKit berhenti. Pengembang menimpa metode ini untuk melakukan tindakan yang memerlukan layar yang dijamin ada di depan mata pengguna.
Tidak seperti viewWillAppear, di mana layar hanya bersiap untuk ditampilkan, viewDidAppear menandakan bahwa pengguna sudah melihat antarmuka. Ini adalah perbedaan kritis: memulai animasi di viewWillAppear dapat menyebabkan frame terlewat, karena UIKit masih memproses transisi. Di viewDidAppear transisi selesai, dan sumber daya controller dapat digunakan untuk merender konten baru.
Metode ini menerima parameter animated bertipe Bool, mirip dengan viewWillAppear. Jika true — kemunculan layar disertai animasi. Parameter ini dapat digunakan untuk menyesuaikan perilaku UI: misalnya, untuk melewatkan animasi masuk saat kembali tanpa animasi.
viewDidAppear dipanggil dalam semua skenario ketika layar telah menyelesaikan proses kemunculan. Mari kita lihat kasus utama dari perspektif pengembang iOS.
Setelah UINavigationController menyelesaikan animasi push atau pop, viewDidAppear dipanggil pada controller tujuan. Untuk layar pertama di stack, aktif setelah animasi pembukaan awal. Ini adalah skenario utama dan menjadi acuan saat menempatkan logika di viewDidAppear.
Ketika pengguna menutup controller yang ditampilkan secara modal dan kembali ke layar sebelumnya, UIKit memanggil viewDidAppear pada controller yang kembali. Parameter animated akan sesuai dengan apakah dismiss dilakukan dengan animasi. Momen ini penting untuk memperbarui UI setelah menerima data dari layar anak.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
logScreenView()
startOnboardingAnimation()
}
UITabBarController memanggil viewDidAppear pada controller tab yang dipilih setelah perpindahan selesai. Ini berbeda dengan viewWillAppear yang aktif saat perpindahan dimulai. Jika pada tab ada animasi selamat datang atau perlu melacak waktu aktif, viewDidAppear adalah tempat yang tepat.
Ketika aplikasi kembali dari background ke foreground, viewWillAppear dan viewDidAppear dapat dipanggil pada controller yang terlihat, jika siklus hidup View untuk sementara dijeda. Namun untuk pelacakan yang andal saat kembali dari latar belakang, gunakan secara terpisah UIApplication.willEnterForegroundNotification.
viewDidAppear menyelesaikan tugas yang memerlukan layar terlihat untuk eksekusi yang benar. Mari kita lihat skenario penggunaan utama dalam proyek nyata.
Tugas paling umum dari viewDidAppear — pelacakan tampilan layar. Sistem analitik seperti Firebase Analytics, Amplitude, atau Mixpanel harus menerima event hanya setelah layar benar-benar ditampilkan kepada pengguna. Mengirim event di viewWillAppear dapat merendahkan waktu tampilan dan membuat pemicu palsu.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
Analytics.logEvent(
name: "screen_view",
parameters: [
"screen_name": "ProfileScreen",
"screen_class": String(describing: self)
]
)
}
Animasi yang harus dimulai setelah kemunculan layar — kemunculan elemen dengan penundaan, paralaks, tutorial — dijalankan di viewDidAppear. Pada saat ini konteks grafis sepenuhnya siap, dan animasi akan mulus, tanpa frame terlewat di awal. Ini sangat penting untuk animasi yang menggunakan UIViewPropertyAnimator.
Operasi asinkron berat — memuat gambar resolusi tinggi, parsing JSON besar, inisialisasi video — lebih baik dimulai di viewDidAppear daripada di viewDidLoad atau viewWillAppear. Saat metode dipanggil, pengguna sudah melihat antarmuka, sehingga dapat menampilkan skeleton atau loader, tanpa menunda kemunculan layar.
Jika di layar ada elemen yang memerlukan pembaruan periodik — timer hitung mundur, indikator pemuatan, animasi progres — mereka dimulai di viewDidAppear dan dihentikan di viewDidDisappear. Ini mencegah kerja timer saat layar tidak terlihat, menghemat baterai dan sumber daya CPU.
Konten media — video, audio, animasi Lottie — dimulai tepat di viewDidAppear, bukan lebih awal. Jika memulai pemutaran di viewWillAppear, pengguna akan melewatkan detik-detik pertama saat layar masih muncul. Di viewDidAppear Anda dapat memulai AVPlayer atau animasi Lottie dengan keyakinan bahwa pengguna melihat konten dari frame pertama. Ini sangat penting untuk layar onboarding dan splash screen, di mana ketepatan waktu sangat penting.
Momen yang tepat untuk memulai animasi secara langsung mempengaruhi persepsi kelancaran antarmuka. Perbedaan antara memulai di viewWillAppear dan viewDidAppear mungkin tidak terlihat pada animasi sederhana, tetapi kritis untuk adegan yang kompleks.
Ketika UIKit melakukan transisi push antar layar, ia membuat screenshot, menganimasikannya, dan secara bersamaan memanggil viewWillAppear pada controller baru. Jika pada saat ini Anda memulai animasi berat — paralaks, blur, transformasi — UIKit dapat melewatkan frame animasi transisi, menciptakan efek tersendat. viewDidAppear menjamin bahwa animasi transisi selesai dan Anda memiliki kontrol penuh atas rendering.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
UIView.animate(
withDuration: 0.6,
delay: 0.3,
usingSpringWithDamping: 0.8,
initialSpringVelocity: 0.5
) {
self.cardView.alpha = 1.0
self.cardView.transform = .identity
}
}
Gunakan penundaan dan redaman untuk menciptakan kemunculan elemen berjenjang alami. Pendekatan ini meningkatkan persepsi antarmuka dan meningkatkan dwell time — pengguna mempelajari konten lebih lama, yang berdampak positif pada metrik perilaku.
Penggunaan yang salah viewDidAppear dapat menyebabkan masalah kinerja, perilaku animasi yang tidak terduga, dan pelacakan berlebihan. Mari kita lihat kesalahan umum.
Kesalahan pertama — banyak panggilan. viewDidAppear dapat dipanggil beberapa kali dalam skenario tertentu: mengganti tab, kembali dari latar belakang, transisi modal. Jika operasi berat dijalankan dalam metode tanpa pemeriksaan flag, operasi akan terduplikasi. Untuk tindakan satu kali, gunakan flag hasAppeared atau dispatchOnce.
Kesalahan kedua — memulai permintaan jaringan tanpa pembatalan saat disembunyikan. Jika pengguna meninggalkan layar sebelum permintaan selesai, hasilnya dapat diterapkan ke View yang sudah disembunyikan. Gunakan URLSessionTask yang dapat dibatalkan dan akhiri di viewDidDisappear.
Kesalahan ketiga — pelacakan di viewWillAppear alih-alih viewDidAppear. Beberapa pengembang mengirim event analytics di viewWillAppear, tetapi ini menciptakan pemicu palsu jika layar tidak muncul (misalnya, pada gesture pop yang dibatalkan). viewDidAppear adalah satu-satunya indikator andal bahwa pengguna benar-benar melihat layar.
Kesalahan keempat — lupa super. Panggilan super.viewDidAppear diperlukan untuk pengoperasian UINavigationController, UITabBarController, dan UISplitViewController yang benar. Tanpanya, mekanisme navigasi dan pembaruan antarmuka standar dapat rusak.
Kesalahan kelima — mengubah orientasi atau ukuran layar tanpa mempertimbangkan viewDidLayoutSubviews. Jika animasi Anda di viewDidAppear bergantung pada ukuran akhir View, ingatlah bahwa viewDidLayoutSubviews dapat dipanggil beberapa kali sebelum viewDidAppear. Pada kemunculan pertama layar, tata letak selesai sebelum panggilan viewDidAppear, tetapi pada perubahan ukuran berikutnya — misalnya, saat rotasi perangkat — viewDidAppear mungkin tidak dipanggil, dan animasi Anda tidak akan berjalan. Dalam kasus seperti itu, gunakan viewDidLayoutSubviews dengan pemeriksaan flag firstLayout.
Implementasi yang benar memerlukan penyimpanan referensi ke objek animasi dan pembatalan eksplisit saat meninggalkan layar. Kesalahan keenam — menjalankan animasi tak terbatas tanpa flag penghentian. Jika di viewDidAppear Anda menjalankan animasi berulang (misalnya, indikator berdenyut atau loader berputar), tetapi tidak menghentikannya di viewDidDisappear, animasi akan menghabiskan sumber daya GPU bahkan saat layar disembunyikan. Selalu simpan referensi ke animasi aktif dan panggil removeAllAnimations atau setCompletion di metode pengakhiran siklus hidup yang sesuai.
Kesalahan ketujuh — mengabaikan viewDidDisappear untuk menghentikan aktivitas. Jika Anda mulai mendengarkan GPS, akselerometer, atau giroskop di viewDidAppear, pastikan untuk menghentikannya di viewDidDisappear. Jika tidak, sensor akan terus bekerja di latar belakang, menghabiskan baterai, bahkan jika pengguna sudah lama pindah ke layar lain. Gunakan panggilan berpasangan start dan stop di metode siklus hidup yang sesuai — ini menjamin pengelolaan sumber daya perangkat yang benar.
Pertanyaan yang Sering Diajukan
viewWillAppear dipanggil sebelum animasi kemunculan, ketika layar belum terlihat. viewDidAppear — setelah animasi selesai sepenuhnya, ketika layar terlihat dan tersedia untuk interaksi.
Di viewDidAppear animasi transisi UIKit sudah selesai dan semua sumber daya rendering tersedia untuk controller Anda. Memulai animasi lebih awal dapat menyebabkan frame terlewat dan antarmuka tersendat.
Dalam siklus hidup normal tidak — viewDidAppear selalu mengikuti viewWillAppear. Namun dalam beberapa skenario pemulihan status, sistem mungkin hanya memanggil viewDidAppear.
Tambahkan pemeriksaan flag firstAppearance atau gunakan kombinasi penghitung dan nama layar. Misalnya, kirim event screen_view hanya saat firstAppearance = true, lalu reset flag.
Saat kembali dari background, UIKit dapat memanggil viewDidAppear pada controller yang terlihat, jika View telah dibongkar dari memori. Untuk pelacakan yang andal, gunakan notifikasi AppDelegate.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga