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.
UIWindow
adalah hal yang harus dilakukan, tetapi belum punya waktu untuk bereksperimen banyak.Jawaban:
Saya mengalami masalah serupa baru-baru ini. Saya harus menghapusnya secara manual
UITransitionView
dari jendela untuk memperbaiki masalah, lalu memanggil tutup pada pengontrol tampilan root sebelumnya untuk memastikan dialokasikan.Perbaikannya tidak terlalu bagus tetapi kecuali Anda telah menemukan cara yang lebih baik sejak memposting pertanyaan, itu satu-satunya hal yang saya temukan untuk berfungsi!
viewController
hanyanewController
dari pertanyaan awal Anda.Saya harap ini membantu Anda memperbaiki masalah Anda juga, itu benar-benar menyebalkan!
(Lihat riwayat edit untuk versi Swift lainnya)
Untuk implementasi yang lebih baik sebagai ekstensi yang
UIWindow
mengizinkan transisi opsional untuk diteruskan.Pemakaian:
Atau
sumber
UITransitionView
di aplikasi Anda seperti yang diambil sebagai bagian dari simbol aplikasi yang menurut saya akan digunakan App Store untuk memeriksa.Saya menghadapi masalah ini dan itu mengganggu saya sepanjang hari. Saya sudah mencoba solusi obj-c @ Rich dan ternyata ketika saya ingin menyajikan viewController lain setelah itu, saya akan diblokir dengan UITransitionView kosong.
Akhirnya, saya menemukan cara ini dan itu berhasil untuk saya.
Baiklah, sekarang yang harus Anda lakukan adalah menelepon
[self setRootViewController:newViewController];
saat Anda ingin beralih pengontrol tampilan root.sumber
dismissViewControllerAnimated:
tampilan mungkin sedikit lebih baik daripada tidak ada animasi. Apakah menghindari hantuUITransitionView
dalam hierarki tampilan.Saya mencoba hal sederhana yang bekerja untuk saya di iOs 9.3: hapus saja tampilan viewController lama dari hierarki selama
dismissViewControllerAnimated
penyelesaian.Mari kita kerjakan tampilan X, Y, dan Z seperti yang dijelaskan oleh benzado :
Yang memberi:
Dalam kasus saya, X dan Y adalah dealloc yang baik dan pandangan mereka tidak lagi dalam hierarki!
sumber
Punya masalah serupa. Dalam kasus saya, saya memiliki hierarki viewController, dan salah satu pengontrol tampilan anak memiliki pengontrol tampilan yang disajikan. Ketika saya mengubah pengontrol tampilan root windows, untuk beberapa alasan, pengontrol tampilan yang disajikan masih ada di memori. Jadi, solusinya adalah menutup semua pengontrol tampilan sebelum saya mengubah pengontrol tampilan root windows.
sumber
Saya sampai pada masalah ini saat menggunakan kode ini:
Menonaktifkan kode ini, memperbaiki masalah. Saya berhasil membuat ini berfungsi dengan hanya mengaktifkan animasi transisi ini ketika filterbar yang dianimasikan diinisialisasi.
Ini sebenarnya bukan jawaban yang Anda cari, tetapi dapat membawa Anda ke landasan yang tepat untuk menemukan solusi Anda.
sumber