Ayaklarımı ilk kez iOS geliştirmeye yatırıyorum ve yapmam gereken ilk şeylerden biri, olası birkaç çocuk görüntüleme denetleyicisinden hangisini değiştiren özel bir kapsayıcı görünümü denetleyicisi uygulamaktı - hadi SideBarViewControllerdiyelim - neredeyse tamamen standart bir Sekme Çubuğu Denetleyicisi gibi gösterir . (Hemen hemen bir Sekme Çubuğu Denetleyicisi, ancak sekme çubuğu yerine gizlenebilir bir yan menüye sahip.)
Apple belgelerindeki talimatlara göre, addChildViewControllerkapsayıcıma her çocuk ViewController eklediğimde arıyorum . Mevcut çocuk görüntüleme denetleyicisini değiştirmek için kodum şu şekilde SideBarViewControllergörünüyor:
- (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];
}
Sonra addChildViewControllerburada ne olduğunu anlamaya çalıştım ve hiçbir fikrim olmadığını anladım. Yeni yapışmasını yanında ViewControlleryer .childViewControllersdizide, o şey üzerinde hiçbir etkisi var gibi gözüküyor. Çocuk denetleyicinin görüşünden, film şeridinde belirlediğim alt denetleyiciye kadar eylemler ve çıkışlar, hiç aramasam bile hala gayet iyi çalışıyor addChildViewControllerve başka neleri etkileyebileceğini hayal edemiyorum.
Nitekim, kodumu arama yapmamak için yeniden yazarsam addChildViewControllerve bunun yerine şöyle görünürsem ...
- (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;
}
... o zaman, anlayabildiğim kadarıyla uygulamam hala mükemmel çalışıyor!
Apple belgeleri, neyin addChildViewControllerişe yaradığına veya neden onu çağırmamız gerektiğine pek ışık tutmuyor. Yöntemin ne yaptığına veya neden UIViewControllerSınıf Referansındaki bölümünde kullanılması gerektiğine ilişkin ilgili açıklamanın tüm kapsamı şu anda:
Verilen görünüm denetleyicisini alt öğe olarak ekler. ... Bu yöntemin yalnızca özel bir konteyner görünümü denetleyicisinin uygulaması tarafından çağrılması amaçlanmıştır. Bu yöntemi geçersiz kılarsanız, uygulamanızda super'i çağırmanız gerekir.
Aynı sayfada daha önce şu paragraf var:
Kapsayıcı görünümü denetleyiciniz, çocuğun kök görünümünü görünüm hiyerarşisine eklemeden önce bir çocuk görünümü denetleyicisini kendisiyle ilişkilendirmelidir. Bu, iOS'un olayları çocuk görüntüleme denetleyicilerine ve bu denetleyicilerin yönettiği görünümlere doğru şekilde yönlendirmesine olanak tanır. Benzer şekilde, bir çocuğun kök görünümünü görünüm hiyerarşisinden çıkardıktan sonra, bu çocuk görünümü denetleyicisinin kendisiyle olan bağlantısını kesmelidir. Bu ilişkilendirmeleri yapmak veya bozmak için, kapsayıcınız temel sınıf tarafından tanımlanan belirli yöntemleri çağırır. Bu yöntemlerin, konteyner sınıfınızın istemcileri tarafından çağrılması amaçlanmamıştır; bunlar, yalnızca konteynerinizin uygulaması tarafından beklenen muhafaza davranışını sağlamak için kullanılacaktır.
İşte aramanız gerekebilecek temel yöntemler:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
ancak bahsettiği "olayların" veya "beklenen sınırlama davranışının" ne olduğuna veya bu yöntemleri çağırmanın neden (veya hatta ne zaman) "gerekli" olduğuna dair herhangi bir ipucu sunmaz.
Apple belgelerinin "Özel Kap Görünümü Denetleyicileri" bölümündeki özel kap görünümü denetleyicileri örneklerinin tümü bu yöntemi çağırıyor, bu nedenle alt ViewController'ı bir diziye yerleştirmenin ötesinde bazı önemli bir amaca hizmet ettiğini varsayıyorum, ancak anlayamıyorum bu amacın ne olduğunu öğrenin. Bu yöntem ne işe yarar ve neden onu çağırmalıyım?

