-ViewWillAppear: ve -viewDidAppear arasındaki fark nedir :?


131

Arasındaki fark nedir -[UIViewController viewWillAppear:]ve -[UIViewController viewDidAppear:]?


1
teşekkürler BoltClock, ama lütfen bana mümkünse her ikisine de örnek verin ..
PJR

3
@BoltClock bu doğru olsaydı iyi olurdu. Sanırım ek oy veren 15 kişi yöntem adını okudu ama aslında ölçmedi ... Google'dan buraya geldi çünkü aralarındaki fark bu DEĞİL
Adam

1
Özellikle: parentView.viewDidAppear, Apple aslında parentView'ı görüntülemeden önce UZUN SÜRE olarak adlandırılır ... Apple önce (atomik olarak) tüm alt görünümleri boyar ... ve çok sayıda alt görünümünüz veya karmaşık olanlarınız varsa, "viewDidAppear" onlarca olarak adlandırılabilir veya yüzlerce milisaniye çok erken :(.
Adam

Yanıtlar:


292

Genel olarak yaptığım şey bu:

1) ViewDidLoad - Görünümle birlikte görünmesi gereken bir görünüme kontroller eklediğimde, hemen ViewDidLoad yöntemine koyarım. Temel olarak bu yöntem, görünüm belleğe her yüklendiğinde çağrılır. Örneğin, benim görüşüm 3 etiketli bir formsa, etiketleri buraya eklerim; görüş bu biçimler olmadan asla var olmayacak.

2) ViewWillAppear : ViewWillAppear'ı genellikle sadece formdaki verileri güncellemek için kullanıyorum. Dolayısıyla, yukarıdaki örnek için, bunu etki alanımdaki verileri forma gerçekten yüklemek için kullanırdım. UIViews oluşturmak oldukça pahalıdır ve bunu ViewWillAppear yönteminde yapmaktan mümkün olduğunca kaçınmalısınız, çünkü bu çağrıldığında iPhone zaten UIView'ı kullanıcıya göstermeye hazırdır ve burada yaptığınız ağır herhangi bir şey performansı çok görünür bir şekilde etkileyecektir (geciken animasyonlar vb.).

3) ViewDidAppear : Son olarak, örneğin yukarıdaki form için fazladan veri almak üzere bir web hizmeti çağrısı yapmak gibi, yürütülmesi uzun zaman alacak şeylere yeni iş parçacıkları başlatmak için ViewDidAppear kullanıyorum. zaten mevcutsa ve kullanıcıya görüntüleniyorsa, verileri alırken kullanıcıya güzel bir "Bekliyor" mesajı gösterebilirsiniz.


4
Pardon ama "etki alanımdaki verileri forma yükle" ile ne demek istiyorsun viewWillAppear? Ağ üzerinden mi indirmek istiyorsunuz? Ama içinde bir şeyler indirmeyi de öneriyorsunuz viewDidAppear?
Philip007

1
@ Philip007 Bence Stack bu tür bir etki alanına atıfta bulunuyor: en.wikipedia.org/wiki/Domain-specific_modeling . Veriler, modellerinizden veya benzerlerinden yüklenir.
dentarg

2
Bu cevap belgelerde yer almalıdır. Üç yöntem arasındaki farkı netleştirmede gerçekten yardımcı oldu. Teşekkür ederim!
GangstaGraham

1
+1 Bu üçü arasındaki farkı anlamakta biraz kafa karışıklığı yaşıyordum, ama sen bunu mükemmelden daha fazla çözdün @ChetanBhalara
Chisx

@ChetanBhalara ama üzerinde uzun süre çalışırsanız, ViewDidAppearkullanıcının UI hakkında kafasını kolayca karıştırırsınız :)
hqt

46

viewDidLoad === >>> Başlatma kodunuzu buraya yerleştirin. Görünüm yaşam döngüsü boyunca değişebilecek dinamik verileri koymayın. Yani, çekirdek verilerden veri çekiyorsanız, bu, görünümün ömrü boyunca değişebilirse, burada yapmak istemezsiniz. Örneğin: bir sekme denetleyiciniz olduğunu varsayalım. Tab1'den tab2'ye geçiş yaparsınız ve tab2'de modelde bir değişiklik yaparsınız. Tab1'e geri dönerseniz ve model kodunuz viewDidLoad'da yapıldıysa, bu güncellenmez (KVO veya NSFetchedResultsController, vb. Kullanmadığınız varsayılarak).

viewWillAppear === >>> Bu, görünüm zaten bellekte olsa da olmasa da, görünüm her ortaya çıktığında çağrılır. Model mantığı gibi dinamik kodunuzu buraya yerleştirin.

viewDidAppear === >>> Buraya, ağ aramaları gibi, yalnızca görünümün ekranda olduğundan eminseniz yapmak isteyeceğiniz pahalı işlemleri koyun.

Uyarı: Uygulamanızın arka planı varsa ve ön plana dönüyorsa, bunu NSNotificationCenter kullanarak halletmeniz gerekir. Aşağıdaki yorumlarda bunun için kodu yazdım. ViewWillAppear / viewDidAppear'ın ateşleneceğini düşünebilirsiniz. Oraya bir kırılma noktası koyun ve test edin. Ateş etmiyor. Dolayısıyla, arka planda uygulamanız için bir şey değiştiyse, bildirimleri kullanarak bunu güncellemeniz gerekir.


1
Uygulamayı küçültmeyi her kaldırdığınızda ViewWill veya ViewDid çalışıyor mu?
Jeef

2
@Jeef Bu mükemmel bir soru. Uygulama sistem veya kullanıcı tarafından arka plandayken öldürülmedikçe ikisi de çalıştırılmaz. Uygulama küçültülmemiş durumdayken bildirim almak için yapmanız gereken, UIApplicationWillEnterForegroundNotification adı için NSNotificationCenter ve addObserver kullanmanız gerektiğidir. Seçici applicationWillEnterForeground olmalıdır: NSNotification parametresine sahiptir. Verileri yeniden yüklemek vb. İçin kodunuzu bu yönteme koyun. Yapabileceğiniz şey, bu yöntemden çağıracağınız bir yeniden yükleme yöntemi oluşturmak ve aynı olmaları gerekiyorsa viewDidAppear'ı da oluşturmaktır.
smileBot

2
@Jeef şunun gibi bir şey: - (void) viewDidLoad {[[NSNotificationCenter defaultCenter] addObserver: kendi kendine seçici: @selector (applicationWillEnterForeground :) adı: UIApplicationWillEnterForegroundNotification nesnesi: nil]; } - (void) applicationWillEnterForeground: (NSNotification *) notif {// burada ne olursa olsun yanıt verin}
smileBot

12

viewWillAppearYöntem, gerçek bir görünümünü yüklemeden önce adlandırılır.

viewDidAppearYöntemi görünümü zaten yüklendiğinde denir ve bir şey göstermek istiyorum edilmektedir.


9

viewWillAppear:
■ Görünüm pencerenin görünüm hiyerarşisine
eklenmeden önce çağrılır ■ [vc.view layoutSubviews] 'den önce çağrılır (gerekirse)
viewDidAppear :
■ Görünüm hiyerarşisine eklendikten
sonra çağrılır ■ [vc.view layoutSubviews] sonrasında çağrılır (Eğer gerekliyse)


7

Birkaç gözlem:

  • viewDidLoadGörünüm ilk örneği zaman yöntemi olarak adlandırılır. IBOutletbaşvurular, bu çağrıldığı zamana kadar bağlanır, ancak daha önce değil. Bununla framebirlikte, görüş, buna çağrıldığı zamana kadar belirlenmemiş olabilir. Bu, alt görünümleri ve bunlarla ilişkili kısıtlamaları eklemek / yapılandırmak için harika bir yerdir. Ancak frame, ana görünümün boyutlarına dayalı olarak herhangi bir manuel değer yapılandırması yapıyorsanız , bu çerçevelerin yapılandırması viewWillAppearveya tarihine kadar ertelenmelidir viewDidLayoutSubviews.

  • viewWillAppearGörünümü hiyerarşisinde bakış sunum başlamasından üzereyken yöntemi denir. Bu özellikle, görünümün sunumunun (varsa) animasyonunun başlangıcında çağrılır. viewWillDisappearBu görüşten uzaklaşmaya başladığında açıkçası ona yoldaşı denir.

  • viewDidAppearBakış sunum yapıldığında yöntemi, herhangi bir ve tüm ilişkili animasyon bittikten özellikle zaman, olarak adlandırılır. Onun arkadaşı, viewDidDisappearbu görüşten uzaklaşıldığında açıkça çağrılır.

İki önemli uyarı:

  • viewDidLoadgörünüm ilk kez somutlaştırıldığında bir kez ve yalnızca bir kez çağrılır. Öte yandan, viewWillAppearve viewDidAppeargörünüm ilk sunulduğunda sadece aradım ama sonraki her zaman söz konusu aynı görünüm yeniden takdim edilecektir. Örneğin, bir görünümü ilk sunduğunuzda, bu yöntemlerin üçü de çağrılacaktır. Söz konusu görüş sonradan sonradan reddedilmiştir, başka bir görünüm sunar ederse viewWillAppearve viewDidAppearsöz konusu görünüm eklendi ve geri görünüm hiyerarşi içinde animasyonlu edildiğinde genellikle tekrar çağrılır, ancak viewDidLoadolmayacak. viewDidLoadyalnızca bu belirli örnek ilk oluşturulduğunda çağrılır.

    Bu nedenle, bir görünüm her yeniden ortaya çıktığında bir şey yapmak istiyorsanız (örneğin onu kapatırsanız veya geri dönerseniz), viewWillAppearveya içinde yapın viewDidAppear. Bunun yalnızca görünüm ilk kez somutlaştırıldığında olmasını istiyorsanız, bunu yapın viewDidLoad.

  • Çağrılması viewWillAppearo görünüme bu geçişi garanti etmez hiç tamamlanacaktır. Özellikle, gerçek zamanlı kullanıcı girdisi tarafından yönlendirilen etkileşimli geçiş kullanıyorsanız, ancak bu etkileşimli geçiş iptal edilebilir. Yani, sadece viewWillAppearçağrıldığı için, aranacağı anlamına gelmez viewDidAppear. Genellikle öyledir, ancak etkileşimli hareket iptal edilirse olmaz (çünkü geçiş asla bitmez).

    WWDC 2013'te, etkileşimli geçişler bağlamında, bir sunum viewWillAppearyapan kişi " viewMightAppearveya viewWillProbablyAppear, veya iReallyWishThisViewWouldAppear" olarak yeniden adlandırması gerektiği konusunda şaka yaptı .

    Yerleşik etkileşimli harekete bir örnek, a kullanırken UINavigationControllerve görünümde bir pop başlatmak için "sol kenardan kaydırmanız" dır . viewWillAppearEğer haşhaş hangi görünümü için çağrılır, ancak bu pop jest yapmaya başladıkları görünümüne geri dönmek için bu "sol kenarından tokatlamak" iptal ederseniz, pop iptal edilir ve viewDidAppeargörünümü için size başladı 'a geri dön asla aranmayacak.

    Bunun net etkisi, her çağrının viewWillAppearsonunda bir 'a çağrısı ile takip edileceğini varsayan bir kod yazmamaya dikkat etmeniz gerektiğidir viewDidAppear. Geçiş iptal edilirse, durum böyle olmayacaktır.


5

viewwillappear, görünümü yüklemeden önce çağırır, böylece bu görünümü yüklemeden önce belirli bir görevi yapabilirsiniz ve viewdidappear, görünümü yükledikten sonra çağırır, böylece gönderme görevi bu yöntemde yapılır


4

"Will" ve "did" arasındaki fark ... Adından da anlaşılacağı gibi, viewWillAppear, görünüm ortaya çıkmadan önce çağrılır ve viewDidAppear çağrılır.


70'in üzerinde olumlu oy içeren kabul edilen yanıta bakın kardeşim. :)
PJR

4

1) ViewWillAppear : Gerçekte belleğe yüklenen görünüm, görünüm denetleyicisinde bir kez çağrıldı ve çerçevesi vardı, ancak yine de kullanıcıya görünmedi

2) ViewDidAppear : Denetleyici görünüm hiyerarşisine eklendi, böylece bir sonraki denetleyiciye sunabilirsiniz, ayrıca görünüm alt görünümleri düzenledi



3

Sonuç olarak:

-viewWillAppear -> verileri güncelle (verileri bir tablo görünümünden yeniden yükleyin)

-viewDidAppear -> pahalı işlemler (güzel bir ilerleme ile API çağrısı!)


1

Adından da anlaşılacağı gibi viewWillAppear, görünüm ortaya çıkmadan önce çağrılır ve görünüm göründüğünde viewDidAppearçağrılır.


0

Kullanım alanı , yani hangisini ne zaman kullanmalıyım?

viewDidLoad - etiketler, düğmeler (yani herhangi bir kontrol / alt görünüm) View'un arayüz dosyasına bağlandığında ve bunların hepsini ViewController'ın Görünümü ile aynı anda yüklemek istiyorsanız ve bunu bir kez belleğe yüklemek ve onunla bitti

viewWillAppear- Diyelim ki, viewController ekranda her göründüğünde görünümün arka plan rengini değiştirmek istiyorsunuz. Ya da daha gerçekçi bir şekilde, günün gece DarkMode arka plan rengini ve gündüz saatlerinde arka plan görünümünün açık rengini istiyorsanız, bu koda gidin.viewWillAppear

Burada başka bir iyi kullanım alanı https://stackoverflow.com/a/39395865/5438240

Ayrıca, bir Gezinme yığını ( UINavigationController) kullanıyorsanız, açılacak olan viewController viewWillDisappear()çağrılır ve yığının en üstünde olacak ViewController viewWillAppear()çağrılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.