UIViewController viewDidLoad ve viewWillAppear: Doğru işbölümü nedir?


164

Hep atanması gereken görevler türüne biraz belirsiz olmuştur viewDidLoadvs. viewWillAppearbir de: UIViewControlleralt sınıf.

Örneğin UIViewController, bir sunucuya isabet, veri almak, bir görünüme beslemek ve daha sonra bu görünümü görüntülemek bir alt sınıf var bir uygulama yapıyorum . Bu yapmanın avantajları ve dezavantajları nelerdir viewDidLoadvs. viewWillAppear?

Yanıtlar:


251

viewDidLoad bir kez yapmanız gereken şeydir. viewWillAppear görünüm her görüntülendiğinde çağrılır. UILabel metinlerinizi ayarlamak gibi viewDidLoad'da yalnızca bir kez yapmanız gerekenleri yapmanız gerekir. Ancak, kullanıcı her görüntülediğinde görünümün belirli bir bölümünü değiştirmek isteyebilirsiniz, örneğin iPod uygulaması "Şimdi Çalınıyor" görünümüne her gittiğinizde şarkı sözlerini tekrar en üste kaydırır.

Ancak, bir şeyi sunucudan yüklerken, gecikmeyi de düşünmeniz gerekir. Tüm ağ iletişiminizi viewDidLoad veya viewWillAppear'a paketlerseniz, kullanıcı görünümü görmeden önce yürütülür - muhtemelen uygulamanızın kısa bir donmasıyla sonuçlanır. İlk olarak kullanıcıya bir tür faaliyet göstergesiyle doldurulmamış bir görünüm göstermek iyi bir fikir olabilir. Ağınızla işiniz bittiğinde (bir veya iki saniye sürebilir (hatta başarısız olabilir - kim bilir?), Görünümü verilerinizle doldurabilirsiniz. Bunun nasıl yapılabileceğine dair iyi örnekler çeşitli twitter istemcilerinde görülebilir. Örneğin, yazar ayrıntı sayfasını Twitterrific'te görüntülediğinizde, görünümde ağ sorguları tamamlanana kadar yalnızca "Yükleniyor ..." yazıyor.


Yani, viewWillAppear ile ilgili potansiyel olarak tekrar tekrar çağrılır. Örneğin, viewcontrollers görünümü gizlendikten sonra görünür hale geldiyse bu yöntem tetiklenir mi? ViewWidAppear hangi senaryoda, viewDidLoad çağrısı yapılmadan önce çağrılır?
dugla

7
viewDidLoad YALNIZCA görünüm oluşturulduğunda çağrılır - örneğin bir görünüm denetleyicisine görünüme erişildiğinde initFromNibNamed çağrısından sonra. viewWillAppear, görünüm denetleyiciniz görünmediğinde ancak görünmeye başladığında çağrılır - bu nedenle görünüm denetleyicinize basıldığında viewWillAppear çağrılır. Oradan başka bir alt görünüm gönderirseniz ve kullanıcı geri dönerse, viewWillAppear yeniden çağrılır.
Kendall Helmstetter Gelner

Teşekkürler Kendall. Yah, stratejik olarak yerleştirilmiş birkaç NSLogs beni sıraladı. viewWillAppear / viewWillDisscontroller push / pops üzerinde ateş yakar.
dugla

3
Görünüm gizliyse ve bellekle ilgili nedenlerden dolayı kaldırılırsa, viewDidLoad işlevinin de çağırılacağını unutmayın. Neye güvenebilirsiniz: viewDidLoad, görünüm ilk oluşturulduğunda EN AZ BİR KEZ olarak ve gizlendikten sonra görünüm yeniden ortaya çıktığında OLASI bir kez daha çağrılır. Görünüm ekranda görünmek üzere olduğunda DAİMA viewWillAppear çağrılacaktır.
DanM

2
Birisi bu iki ilgili soru hakkında daha fazla yorum yapabilir: (2) Apple'ın splitViewController'ın detailView (iPad) şablonunda, configureView yöntemi vardır - viewDidLoad ve ViewWillAppear'a göre oraya ne gitmelidir?
Jeff

12

Başlangıçta yalnızca tableView ile ViewDidLoad kullanılır. Wifi kaybıyla test yaparken, cihazı uçak moduna ayarlayarak, tablonun Wifi dönüşüyle ​​yenilenmediğini fark etti. Aslında, -Info.plist içinde arka plan modu EVET olarak ayarlanmış ana ekran düğmesine basarak bile cihazda tableView yenilemenin bir yolu yok gibi görünüyor.

Çözümüm:

-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];}

10

Konumlandırma için viewDidLoad kullanmanın biraz riskli olduğunu ve sınırlar belirlenmediğinden kaçınılması gerektiğini belirtmek önemlidir. bu beklenmedik sonuçlara neden olabilir (çeşitli sorunlar yaşadım ...)

Bu yazı , farklı yöntemleri ve her birinde ne olduğunu oldukça iyi açıklıyor.

şu anda bir kerelik başlatma ve konumlandırma için viewDidAppear'ı bir bayrakla kullanmayı düşünüyorum, eğer başka bir öneriniz varsa lütfen bana bildirin.


bununla hemfikir: "... sınırlar belirlenmediğinden kaçınılmalıdır ..."
danisupr4

4

Bağlıdır, Görünümü her açışınızda verilerin yüklenmesi gerekiyor mu? ya da sadece bir kere mi?

resim açıklamasını buraya girin

  • Kırmızı: Her seferinde değişmeleri gerekmez. Yüklendikten sonra nasıl oldukları gibi kalırlar.
  • Mor: Zaman içinde veya her seferinde yükledikten sonra değişmeleri gerekir. Aynı 3 önerilen kullanıcının takip etmesini istemezsiniz, ekrana her döndüğünüzde yeniden yüklenmesi gerekir. Fotoğrafları güncellenebilir ... 5 yıl önceki bir fotoğrafı görmek istemezsiniz ...

viewDidLoad:Sahip olduğunuz işlem ne olursa olsun, bir kez yapılması gerekir.
viewWilLAppear:Sayfa her yüklendiğinde değiştirilmesi gereken işlemler.

Etiketler, simgeler, düğme başlıkları veya çoğu veriInputedByDeveloper genellikle değişmez. İsimler, fotoğraflar, bağlantılar, düğme durumu, listeler (tableViews veya collectionView için giriş Dizileri) veya çoğu dataInputedByUser genellikle değişir.


Mor viewDidAppear değil viewWillAppear denilen olacağını
Alex Kornhauser

@AlexKornhauser ne denir demek istiyorsun? Ben senin içinde söylüyorum viewWillAppearsorgulayabilir ve latests tweet'leri kontrol edebilirsiniz. viewDidAppearbunun için çok geç
Honey
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.