Arasındaki fark nedir -[UIViewController viewWillAppear:]
ve -[UIViewController viewDidAppear:]
?
Arasındaki fark nedir -[UIViewController viewWillAppear:]
ve -[UIViewController viewDidAppear:]
?
Yanıtlar:
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.
viewWillAppear
? Ağ üzerinden mi indirmek istiyorsunuz? Ama içinde bir şeyler indirmeyi de öneriyorsunuz viewDidAppear
?
ViewDidAppear
kullanıcının UI hakkında kafasını kolayca karıştırırsınız :)
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.
viewWillAppear
Yöntem, gerçek bir görünümünü yüklemeden önce adlandırılır.
viewDidAppear
Yöntemi görünümü zaten yüklendiğinde denir ve bir şey göstermek istiyorum edilmektedir.
Birkaç gözlem:
viewDidLoad
Görünüm ilk örneği zaman yöntemi olarak adlandırılır. IBOutlet
başvurular, bu çağrıldığı zamana kadar bağlanır, ancak daha önce değil. Bununla frame
birlikte, 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ı viewWillAppear
veya tarihine kadar ertelenmelidir viewDidLayoutSubviews
.
viewWillAppear
Gö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. viewWillDisappear
Bu görüşten uzaklaşmaya başladığında açıkçası ona yoldaşı denir.
viewDidAppear
Bakış sunum yapıldığında yöntemi, herhangi bir ve tüm ilişkili animasyon bittikten özellikle zaman, olarak adlandırılır. Onun arkadaşı, viewDidDisappear
bu görüşten uzaklaşıldığında açıkça çağrılır.
İki önemli uyarı:
viewDidLoad
görünüm ilk kez somutlaştırıldığında bir kez ve yalnızca bir kez çağrılır. Öte yandan, viewWillAppear
ve viewDidAppear
gö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 viewWillAppear
ve viewDidAppear
sö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 viewDidLoad
olmayacak. viewDidLoad
yalnı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), viewWillAppear
veya 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ı viewWillAppear
o 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 viewWillAppear
yapan kişi " viewMightAppear
veya viewWillProbablyAppear
, veya iReallyWishThisViewWouldAppear
" olarak yeniden adlandırması gerektiği konusunda şaka yaptı .
Yerleşik etkileşimli harekete bir örnek, a kullanırken UINavigationController
ve görünümde bir pop başlatmak için "sol kenardan kaydırmanız" dır . viewWillAppear
Eğ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 viewDidAppear
görünümü için size başladı 'a geri dön asla aranmayacak.
Bunun net etkisi, her çağrının viewWillAppear
sonunda 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.
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
Birincisi, görünüm görünmeden önce olur ve ikincisi daha sonra olur.
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ı!)
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.