iPhone SDK: loadView ve viewDidLoad arasındaki fark nedir?


136

Bir iPhone uygulamasında görünümler ve görünüm denetleyicileriyle çalışırken, herkes loadView ve viewDidLoad arasındaki farkı açıklayabilir mi?

Kişisel bağlamım, tüm görüşlerimi koddan oluşturmam, herhangi bir fark yaratırsa Interface Builder'ı kullanmam ve kullanmam.

Sık sık loadView için init kodu eklediğimde, sonsuz bir yığın izlemesi ile sonuçlandığımı gördüm, bu yüzden genellikle tüm çocuk manzaralı binamı viewDidLoad'da yapıyorum ... ama her yürütüldüğünde gerçekten net değil ve init kodunu koymak için en uygun yer hangisidir? Mükemmel olan, başlatma çağrılarının basit bir diyagramıdır.

Teşekkürler!

Yanıtlar:


200

Burada sorunun ne olabileceğini tahmin edebilirim, çünkü yaptım:

Sık sık loadView için init kodu eklediğimde, sonsuz bir yığın izlemesi ile sonuçlandığımı gördüm

-LoadView'da self.view okumayın. Sadece set yok, bunu almak onu.

Görünüm şu anda yüklü değilse self.view özellik erişimcisi -loadView öğesini çağırır . Sonsuz özyineniz var.

Apple'ın Arayüz Öncesi Oluşturucu örneklerinde gösterildiği gibi, görünümü programlı olarak -loadView içinde oluşturmanın genel yolu şuna benzer:

UIView *view = [[UIView alloc] init...];
...
[view addSubview:whatever];
[view addSubview:whatever2];
...
self.view = view;
[view release];

Ve IB kullanmadığınız için sizi suçlamıyorum. Tüm Instapaper için bu yöntemle sıkıştım ve kendimi IB'nin karmaşıklıkları, arayüz tuhaflıkları ve beklenmedik sahne arkası davranışlarıyla uğraşmaktan çok daha rahat buluyorum.


ahhhh, sonunda bir açıklama için teşekkür ederim! Geçici bir değişken tahsis etme deyiminden uzaklaştım, sonra self.view'e ayarladım, sonra serbest bıraktım ... bir şekilde garip, gereksiz görünüyordu. Şimdi bu kararın neden beni şimdi kendimi bulduğum yolda aşağı çekeceğini anlayabiliyorum.
ryan.scott

Ben böyle bir kod var ve özyineleme yok. neden? -(void) loadView { // Frame for Hypnosis view CGRect frame = [[UIScreen mainScreen] bounds]; // Create a Hipnosis view v = [[HypnosisView alloc] initWithFrame:frame]; self.view = v;
user2054339

44

loadViewUIViewControllergörünümü yükleyecek ve viewözelliğe atayacak yöntemdir . Bu, aynı zamanda UIViewController, viewözelliği programlı olarak ayarlamak istiyorsanız alt sınıfının geçersiz kıldığı konumdur .

viewDidLoadgörünüm yüklendikten sonra çağrılan yöntemdir. LoadView çağrıldıktan sonra bu çağrılır. Yüklendikten sonra görünümün ilk kurulumunu yapan kodu geçersiz kılabileceğiniz ve ekleyebileceğiniz bir yerdir.


14
viewDidLoad()

görünümünüzü bir NIB'den yüklediğinizde ve lansmandan sonra herhangi bir özelleştirme gerçekleştirmek istediğinizde kullanılmalıdır

LoadView()

görünümünüzü programlı olarak oluşturmak istediğinizde kullanılmalıdır (Arayüz Oluşturucu kullanılmadan)


Bu biraz sorun olabilir, benim görünüm denetleyicisi NIB dosyası ile ilişkili değildi zaman test var, viewDidLoad hala denir
ruandao

11

NilObject'in ne dediğini göstermek için bazı kod örnekleri eklemeniz yeterli:

- (void)loadView
{
    // create and configure the table view
    myTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStyleGrouped];   
    myTableView.delegate = self;
    myTableView.dataSource = self;
    myTableView.scrollEnabled = NO;
    self.view = myTableView;

    self.view.autoresizesSubviews = YES;
}

- (void)viewDidLoad 
{
  self.title = @"Create group";

  // Right menu bar button is to Save
  UIBarButtonItem *saveButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Save" style:UIBarButtonItemStyleDone target:self action:@selector(save)];
  self.navigationItem.rightBarButtonItem = saveButtonItem;
  [saveButtonItem release];
}

4
yani, ikiniz arasında, loadView benim denetleyicimin self.view ayırma / init yapmak gerekir ve alt görünümleri viewDidLoad (veya daha sonra) ele gerektiğini söylemek doğru mu?
ryan.scott

2

Self.view okuduğunuzda sonsuz bir döngünün oluşmasını önlemek için, bir görünüm yüklediğinizde sınıfın süper uygulamasını çağırın. Süper uygulama sizin için yeni bir UIView tahsis edecektir.

- (void) loadView {
[super loadview];

// init code here...

[self.view addSubView:mySubview1]; //etc..

}

6
Apple'ın belgelerine aramaman gerektiğini söylediğine yemin edebilirim [super loadView];. Bu örneklerde çelişiyordu, ama bence dokümanlar doğru bir şekilde söyledi (zaman içinde örneklerde çok sayıda hata buldum). [super loadView]olsa da, UITableViewController vb için gereklidir. Ancak! Yükleme sonrası tüm kurulumlar (örn. Ekstra alt görünümler ekleme) viewDidLoad içinde yapılmalıdır.
Ivan Vučica

Şimdiye kadar herhangi bir yan etkisi olmadan [super loadView] çağırdı. Kendinizi yaptığınız bir şeye self.view ayarlamayı düşünüyorsanız doğru olabilir.
Şubat 11:58

LoadView içinde [super loadView] öğesini çağırırsanız, varsayılan adla varsa görünümü bir uçtan yüklemeyi dener. Bu yüzden dikkatli olmalısın.
Ian1971

Ve [super loadView] öğesini çağırırsanız, super loadView yönteminde self.view öğesini başlatırsınız
Alex Nazarsky

1

LoadView kullanmanın en kolay yolu, UIViewController alt sınıfı olan MyBaseViewController gibi bazı temel görünüm denetleyicileri yapmaktır. Bu loadView yönteminde görünümü bu şekilde oluşturun:

-(void) loadView {
    if ([self viewFromNib]) {
        self.view = [self viewFromNib];
    } else {
        self.view = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    }
    self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight;
    self.view.backgroundColor = [UIColor whiteColor];
}

Ve bazı görünüm denetleyicileri yapmanız gerektiğinde, MyBaseViewController alt sınıfını kullanırsınız ve onun loadView denetleyicisinde sadece [super loadView]

//sucblass loadView
-(void) loadView {
    [super loadView];

    //rest of code like this..
    UILabel *myLabel = [[UILabel alloc] initWithFrame:myFrame];
    [self.view addSubview:myLabel];
    [myLabel release];
}

1

loadView()kumandanızdan onu oluşturmanız istendiğinde çağrılır self.view. Kendiniz gibi yapabilirsiniz

self.view = [UIView alloc] init...];

Veya denetleyicinizin üst UIController sınıfında, -loadView()kendi görünümünüzü boş görünüme başlatan bir yöntem adı zaten vardır . Sonra arayabilirsin

[super loadView];

Mirası teşvik ettiği için gerçekten ikinci yaklaşımı öneriyorum. Yalnızca görünüm denetleyiciniz doğrudan UIViewController'dan miras alınmazsa.


0

Apple tarafından viewDidLoad üzerinde verilen tanım, denetleyicinin görünümü belleğe yüklendikten sonra çağrıldığını belirtti. Basit bir ifadeyle, yükleyecek ilk yöntemdir.

Bu yöntemin tam olarak nasıl kullanılacağını düşünüyor olabilirsiniz? Cevap, temel olarak uygulamanın önce yüklenmesini istediğiniz her şeydir. Örneğin, beyaz yerine farklı bir arka plan rengi isteyebilirsiniz, belki de mavi seçebilirsiniz.

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.