Saya baru saja mencelupkan kaki saya untuk pertama kalinya ke dalam pengembangan iOS, dan salah satu hal pertama yang harus saya lakukan adalah menerapkan pengontrol tampilan kontainer khusus - sebut saja SideBarViewController
- yang menukar beberapa kemungkinan pengontrol tampilan anak itu menunjukkan, hampir persis seperti Tab Bar Controller standar . (Ini cukup banyak Tab Bar Controller tetapi dengan menu samping yang dapat disembunyikan, bukan bilah tab.)
Sesuai instruksi dalam dokumentasi Apple, saya menelepon addChildViewController
setiap kali saya menambahkan ViewController anak ke penampung saya. Kode saya untuk menukar pengontrol tampilan anak saat ini yang ditunjukkan oleh SideBarViewController
tampilan seperti ini:
- (void)showViewController:(UIViewController *)newViewController {
UIViewController* oldViewController = [self.childViewControllers
objectAtIndex:0];
[oldViewController removeFromParentViewController];
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self addChildViewController: newViewController];
[self.view addSubview: newViewController.view];
}
Kemudian saya mulai mencoba mencari tahu apa yang addChildViewController
terjadi di sini, dan saya menyadari bahwa saya tidak tahu. Selain menempelkan yang baru ViewController
di .childViewControllers
array, tampaknya tidak berpengaruh pada apa pun. Tindakan dan jalan keluar dari pandangan pengontrol anak ke pengontrol anak yang telah saya setel di papan cerita masih berfungsi dengan baik bahkan jika saya tidak pernah menelepon addChildViewController
, dan saya tidak bisa membayangkan apa lagi yang bisa terpengaruh.
Memang, jika saya menulis ulang kode saya untuk tidak menelepon addChildViewController
, dan malah terlihat seperti ini ...
- (void)showViewController:(UIViewController *)newViewController {
// Get the current child from a member variable of `SideBarViewController`
UIViewController* oldViewController = currentChildViewController;
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self.view addSubview: newViewController.view];
currentChildViewController = newViewController;
}
... maka aplikasi saya masih berfungsi dengan sempurna, sejauh yang saya tahu!
Dokumentasi Apple tidak menjelaskan banyak tentang apa yang addChildViewController
dilakukannya, atau mengapa kami harus menyebutnya. Keseluruhan deskripsi yang relevan tentang apa yang dilakukan metode atau mengapa metode itu harus digunakan dalam bagiannya di UIViewController
Referensi Kelas adalah, saat ini:
Menambahkan pengontrol tampilan yang diberikan sebagai anak. ... Metode ini hanya dimaksudkan untuk dipanggil dengan implementasi pengontrol tampilan penampung khusus. Jika Anda mengganti metode ini, Anda harus memanggil super dalam implementasi Anda.
Ada juga paragraf ini sebelumnya di halaman yang sama:
Pengontrol tampilan penampung Anda harus mengaitkan pengontrol tampilan anak dengan dirinya sendiri sebelum menambahkan tampilan root anak ke hierarki tampilan. Ini memungkinkan iOS untuk merutekan peristiwa dengan benar ke pengontrol tampilan anak dan tampilan yang dikelola pengontrol tersebut. Demikian pula, setelah menghapus tampilan root anak dari hierarki tampilannya, pengontrol tampilan anak tersebut harus diputuskan dari dirinya sendiri. Untuk membuat atau menghancurkan asosiasi ini, penampung Anda memanggil metode tertentu yang ditentukan oleh kelas dasar. Metode ini tidak dimaksudkan untuk dipanggil oleh klien kelas penampung Anda; mereka hanya akan digunakan oleh implementasi penampung Anda untuk memberikan perilaku penahanan yang diharapkan.
Berikut adalah metode penting yang mungkin perlu Anda panggil:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
tetapi tidak menawarkan petunjuk apa pun tentang 'peristiwa' atau 'perilaku penahanan yang diharapkan' yang dibicarakannya, atau mengapa (atau bahkan ketika) menyebut metode ini 'penting'.
Contoh pengontrol tampilan penampung khusus di bagian "Pengontrol Tampilan Penampung Khusus" dari dokumentasi Apple semuanya memanggil metode ini, jadi saya berasumsi bahwa metode ini melayani beberapa tujuan penting lebih dari sekadar memunculkan ViewController anak ke dalam larik, tetapi saya tidak mengerti tahu apa tujuan itu. Apa fungsi metode ini, dan mengapa saya harus menyebutnya?