Saat menyelidiki kebocoran memori, saya menemukan masalah yang berkaitan dengan teknik panggilan setRootViewController:
di dalam blok animasi transisi:
[UIView transitionWithView:self.window
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ self.window.rootViewController = newController; }
completion:nil];
Jika pengontrol tampilan lama (yang sedang diganti) saat ini menampilkan pengontrol tampilan lain, kode di atas tidak menghapus tampilan yang disajikan dari hierarki tampilan.
Artinya, urutan operasi ini ...
- X menjadi Root View Controller
- X menampilkan Y, sehingga tampilan Y ada di layar
- Menggunakan
transitionWithView:
untuk menjadikan Z sebagai Pengontrol Tampilan Root baru
... tampak OK bagi pengguna, tetapi alat Debug View Hierarchy akan mengungkapkan bahwa tampilan Y masih ada di belakang tampilan Z, di dalam a UITransitionView
. Artinya, setelah tiga langkah di atas, hierarki tampilan adalah:
- UIWindow
- UITransitionView
- UIView (tampilan Y)
- UIView (tampilan Z)
- UITransitionView
Saya menduga ini menjadi masalah karena, pada saat transisi, tampilan X sebenarnya bukan bagian dari hierarki tampilan.
Jika saya mengirim dismissViewControllerAnimated:NO
ke X segera sebelumnya transitionWithView:
, hierarki tampilan yang dihasilkan adalah:
- UIWindow
- UIView (tampilan X)
- UIView (tampilan Z)
Jika saya mengirim dismissViewControllerAnimated:
(YA atau TIDAK) ke X, lalu melakukan transisi di completion:
blok, maka hierarki tampilan sudah benar. Sayangnya, itu mengganggu animasi. Jika menganimasikan pemecatan, itu membuang-buang waktu; jika tidak dianimasikan, akan terlihat rusak.
Saya mencoba beberapa pendekatan lain (misalnya, membuat kelas pengontrol tampilan penampung baru untuk berfungsi sebagai pengontrol tampilan root saya) tetapi belum menemukan apa pun yang berfungsi. Saya akan memperbarui pertanyaan ini saat saya melanjutkan.
Tujuan utamanya adalah untuk beralih dari tampilan yang disajikan ke pengontrol tampilan root baru secara langsung, dan tanpa meninggalkan hierarki tampilan yang menyimpang.