Di WWDC 2011 Sesi 102, Apple memperkenalkan View Controller Containment, yang adalah kemampuan untuk membuat wadah pengendali tampilan kustom, analog dengan UITabBarController
, UINavigationController
, dan sejenisnya.
Saya melihat contoh beberapa kali. Ada banyak metode yang terkait dengan pola ini, tetapi agak sulit untuk mengetahuinya dengan tepat. Saya akan memposting di sini apa yang saya pikir sedang terjadi dan melihat apakah komunitas akan mengkonfirmasi atau menghilangkan kecurigaan saya.
Skenario 1: Pindah dari tanpa induk ke pengontrol tampilan induk baru
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];
Apakah dua baris pertama harus muncul dalam urutan yang ditentukan, atau dapatkah dibalik?
Skenario 2: Berpindah dari pengontrol tampilan induk ke tanpa pengontrol tampilan induk
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
Apakah perlu juga menelepon [vc didMoveToParentViewController:nil]
? Contoh di Sesi 102 tidak melakukan hal ini dalam skenario ini, tetapi saya tidak tahu apakah itu kelalaian atau tidak.
Skenario 3: Berpindah dari satu pengontrol tampilan induk ke yang lain
Ini kemungkinan akan terjadi dengan cara berikut, karena logika di setiap pengontrol tampilan induk akan dienkapsulasi.
// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];
Pertanyaan
Pertanyaan utama saya adalah ini: Apakah ini cara kerja penahanan pengontrol tampilan, secara umum? Apakah mekanisme yang diberikan di atas benar?
Apakah perlu menelepon willMoveToParentViewController
sebelum menelepon addChildViewController
? Ini sepertinya urutan yang logis bagi saya, tetapi apakah ini benar-benar diperlukan?
Apakah perlu menelepon didMoveToParentViewController:nil
setelah menelepon removeFromParentViewController
?
sumber
addChildViewController
harus diimbangi dengandidMoveToParentViewController
danwillMoveToParentViewController
harus diimbangi denganremoveFromParentViewController
. Inilah yang saya cari. Tidak yakin bagaimana saya melewatkannya di dokumen.Bagian ini tidak benar:
Menurut dokumen:
Jadi, Anda tidak perlu
[vc willMoveToParentViewController:self]
ditelepon. Ini dilakukan secara otomatis saat Anda menelepon[self addChildViewController:vc]
. Berikut contoh kodenya lagi:Untuk menghapus pengontrol tampilan:
Agaknya panggilan ini
[oldVC didMoveToParentViewController:nil]
.sumber
didMoveToParentViewController
" segera setelah memanggil metode addChildViewController:", ini tidak menentukan kapan Anda benar-benar menambahkan subview anak. Saya ingin tahu apakah semua orang salah paham. Apakah ada contoh di beberapa Apple Docs yang dapat kami periksa?willMoveToParentViewController
sebelumaddChildViewController
jika item yang Anda bergerak adalah kelas kustom dengan ditimpaaddChildViewController
(kecuali override Anda menyebutnya internal)