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
?
addChildViewController
harus diimbangi dengandidMoveToParentViewController
danwillMoveToParentViewController
harus diimbangi denganremoveFromParentViewController
. Inilah yang saya cari. Tidak yakin bagaimana saya melewatkannya di dokumen.