2012-10-16 19 views
18

Ben iOS5 ve yeni UIViewController tecrit yöntemleri ile başlayarak, addChildViewController birlikte bu yöntemleri çağırmak gerekiyor biliyorum:, removeFromParentViewController: ve geçiş yöntemi. Ayrıca üç senaryoda onları çağırmanın doğru sırasını biliyorum. Bilmediğim şey, bu yöntemlerin tam olarak ne yaptığıdır?Tam olarak ne olacak MOWToParentViewController: ve didMoveToParentViewController: do?

bu sadece UIViewController alt sınıfları için puan geçersiz olsaydı biz geçersiz kılmak için süper çağırmak için gerekli olmaz sanırım. nil bir görünüm denetleyicisi veya didMoveToParentViewController çıkarmadan önce: kendinden Ben willMoveToParentViewController aramazsam/Ne yanlış gidecek ki?

cevap

13

, bazı temsilci yöntemleri çağırmak yapın:

addChildViewController aramaları [child willMoveToParentViewController:self]

ve removeFromParentViewController: aramalar [child didMoveToParentViewController:nil] Ayrıca

, onlar bir dizi tutar childViewControllers özelliğini değiştirmek çocuk denetleyicileri.

+2

Evet, 'add' ve 'remove' komutlarını bir yöntemi otomatik olarak çağırır (sırasıyla willMove ... ve didMove ...) ve diğerini manuel olarak çağırmanızı gerektirir. Ben 'add' ve 'remove' yapmanın ne anlama geldiğini anlamakta hiç sorunum yok - bu oldukça zor görünüyor. Ben sadece 'irade' ve 'did' aslında ne yaptıklarını biraz kafamda hissediyorum. – konrad

+2

"Will" ve "did" özel bir uygulamaya sahip değil, siz onları çocuk denetleyicisine çağırıyorsunuz ve eğer yapmıyorsanız, o zaman basitçe aranmıyorlar. Kontrolör onları uyguladı ve onlara güveniyordu. Cevabımla yanlışlıkla onları "temsilci yöntemleri" olarak adlandırdım, ama neredeyse onlar olduklarını, isteğe bağlı temsilci yöntemleri olarak işlev görüyorlar ve çocuk bunları bir takım kurulum veya temizlik yapmak için kullanabilir. Herhangi bir UIViewController alt sınıfı bunları geçersiz kılabilir ve bir kapsayıcı denetleyicisi uygularsanız, bu davranışa saygı duymanız ve bunları çağırmanız gerekir. – Guillaume

+3

Açık olmak gerekirse, UIViewController'ın willMoveToParentViewController: 've' didMoveToParentViewController: 'hiçbir şey yapmayın. Ancak, herhangi bir alt sınıf onların geçersiz kılınmasına izin verir, bu yüzden onları çağırmazsanız, çıplak bir UIViewController'ı kırmayacaksınız, ancak buna dayanan alt sınıfları kıracaksınız (örneğin: bir alt sınıf bir nesneyi yayınlamak istediğinde Metodu çağırmazsanız, ana görüntüleme denetleyicisinden kaldırılır, bu durumda nesneyi asla bırakmaz. – Guillaume

0

Buna çok cevabı vardır: Bunlar

  1. vardır ve nerede uygulanabilir hep desen korumak için aramak gerekiyor. Bu şekilde, üst sınıfları UIViewController'dan kendi görünüm denetleyicinize değiştirirseniz, tüm deseni takip ettiğiniz yer hakkında endişelenmeniz gerekmez.

  2. Herkesi söylüyorum addChildViewController: geçersiz kılmak için daha kanca için daha iyi yerlerdir. Dediğiniz gibi sen super aramayı unutma, özellikle addChildViewController: yanlış manging daha az tehlikeli gibi, yanlış yönetme willMoveToParentViewController: geliyor.

  3. UIViewController muhtemelen desen korumak bağlıdır. Belki de, addChildViewController:'u aldığını bilmezse, ancak diğer iki iletiyi asla almazsa, durumu tutarsız olarak kabul eder. Bunu yaparken nedeniyle UIViewController olur olsun defter tutma da herhangi bir iOS sürümünde değişebilir şey tam desen korumak sizi cezbetmek ya da gerçekten iç durumunu pisliği yapmak ister eğlenceli bir tahmin oyunu olduğunu, bunlarla. İşler kötü bozulabilir. İşte bu yüzden desen var, Apple'ın bunu yapabildiğiniz sürece, her şeyin ne olursa olsun çalışmasına devam edeceğimizi söylememiz gerekiyor. bir desen sorgulamak

iyidir, ama kemiğe bir desen sizin uygunluğunu kesmeye çalışırken ile gelen birçok potansiyel negatif vardır. Desen gülünç bir şekilde sürece dahil değilse, genellikle ona uymak daha kolaydır. söylenenlerin yanında

+2

Ben bu yöntemleri kullanarak sorgulamaya anlamına gelmez. Apple doktorları 'aramanız' diyorsa, bunun arkasında bir neden var. UIViewControllers'ı yerleştirme mekanizmasına dair biraz daha fazla deneyim ve bilgi sahibi olan birinin, resmi raporlardan biraz daha ayrıntılı olarak açıklayacağını ümit ediyorum. Benim teorim, geçişin animasyonlu olmasını istiyorsanız, bazı hazırlık ve temizleme işlemlerine izin vermesidir, ancak bu sadece bir tahmindir. – konrad

+0

Oh, bir "UIViewController" alt sınıfını kullanırsanız kullanacağınız şey budur. Benim amacım, hiçbir şey yapmasa bile, bunun 'süper' bir şeyden kaçınmayacağını bilmemesi gerektiğiydi. Belki de en iyisi "en az dağınıklık yapar" çünkü addChildViewController: '' (point 2) 'yi geçersiz kılmanız gerekmeyecektir. – Jesper

İlgili konular