2009-12-20 18 views
9

Bir uçtan bir görünüm denetleyicisi yüklediğimi ve sahnedeki alt görünümünden biriyle bir şeyler yapmaya karar verdiğimi varsayardım. Daha sonraki bir zamanda, bu görüş denetleyicisinin görünümünü gösteririm.Bir görünüm oluşturma (initWithNibName öğesinden başlatıldı) tüm alt görünümünü yükle

viewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
[viewController.someSubview doSomething]; 

//later on 
[mainView addSubview:viewController.view]; 

sorun görünüşüdür görünene kadar someSubview nesne yüklenecek görünmüyor, yani, bu yöntem doSomething denir. Şimdiye kadar benim geçici çözüm aramaktır:

[mainView addSubview:viewController.view]; 
[viewController.view removeFromSuperview]; 

ilk viewcontroller ait subviews başlatmak için. Bu görev için daha zarif bir yol var mı (bir loadSubviews yöntemi veya bir şey gibi)? Her şeyden

cevap

23

Öncelikle özelliği erişme basitçe denemek istiyorum:

[viewController view]; 

Bu görünümün tembel yükünü zorlar (ve dolayısıyla subviews ve çıkışları vs.) ve bu sizin için yeterli olabilir. Denetleyicileri varsayılan olarak görüntüle, siz erişinceye kadar görünümlerini yüklemez, bu nedenle bir gecikme yaşamanızın nedeni bu olabilir.

Böyle bir yükü zorlamak genellikle bir çıkış özelliğine erişmeye çalıştığınızda çözümdür, ancak gerçekte henüz bağlanmamıştır, örneğinizde someSubview gibi.

Ayrıca, görünümü ekleyerek ancak gizli yaparak işleri biraz artırabilir

:

viewController.view.hidden = YES; 
[mainView addSubview:viewController.view]; 

Sonra yerine bunu göstermek istediğinizde addSubview arayarak, sadece yapın:

viewController.view.hidden = NO; 

I UIViewAnimationTransitionFlipFromRight vb geçişleri kullanarak görünümlerde animasyon yaparken bu yöntemi kullandı. Görüşün tembel bir yükünü zorlarken bile fark edilebilir bir gecikme var, bu yüzden performansı biraz daha iyileştirmek için kullandım.

+0

Teşekkür kullanmak

-(void) loadViewIfNeeded tanıtıldı. – iamj4de

+0

@MarkAmery Apple, dokümantasyonda -loadView'u çağırmamanızı açıkça söyler: "Bu yöntemi doğrudan doğrudan çağırmamalısınız. Görüntüleme denetleyicisi, görünüm özelliği istendiğinde ancak şu anda sıfır olduğunda bu yöntemi çağırır. Bu yöntem, bir görünüm yükler veya oluşturur ve onu görünüm özelliğine atar. " –

+0

@MikeWeller İyi bir nokta - Bunu bilmek için belgelere yakından bakmamıştım. Sanırım iki hafif çirkin hackden birini seçmek zorundayız o zaman. Benim açımdan, muhtemelen daha açık olduğu için loadView'a yapışacağım, ama düşündüğüm temiz çözüm olmadığını kabul ediyorum. –

0

iOS 9 yaptığını, ben

if ([_myVC respondsToSelector:@selector(loadViewIfNeeded)]) { 
    [_myVC loadViewIfNeeded]; 
} else { 
    [_myVC view]; 
} 
İlgili konular