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 SideBarViewController
diyelim - 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, addChildViewController
kapsayıcıma her çocuk ViewController eklediğimde arıyorum . Mevcut çocuk görüntüleme denetleyicisini değiştirmek için kodum şu şekilde SideBarViewController
gö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 addChildViewController
burada ne olduğunu anlamaya çalıştım ve hiçbir fikrim olmadığını anladım. Yeni yapışmasını yanında ViewController
yer .childViewControllers
dizide, 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 addChildViewController
ve başka neleri etkileyebileceğini hayal edemiyorum.
Nitekim, kodumu arama yapmamak için yeniden yazarsam addChildViewController
ve 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 addChildViewController
işe yaradığına veya neden onu çağırmamız gerektiğine pek ışık tutmuyor. Yöntemin ne yaptığına veya neden UIViewController
Sı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?