2009-12-20 61 views
9

假設我從nib加載視圖控制器,並決定在場景後面的某個子視圖中執行某些操作。在稍後的時間,我會展示這個視圖控制器的視圖。使視圖(初始化initWithNibName)加載其所有子視圖

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

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

的問題是,該物體someSubview似乎沒有被加載,直到出現視圖,因此該方法doSomething的不被調用。到目前爲止,我的解決方法是調用:

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

首先初始化viewcontroller的子視圖。有沒有更好的方法(比如loadSubviews方法或者其他)來完成這個任務?

回答

23

首先我會嘗試只是訪問屬性:

[viewController view]; 

這將強制視圖的延遲加載(因此子視圖和出口等),這可能對你是足夠的。默認情況下,視圖控制器在您訪問它之前不會加載視圖,因此這可能是您看到延遲的原因。

強制這樣的負載通常是您試圖訪問插座屬性時的解決方案,但實際上尚未綁定,例如someSubview

你也可以通過添加視圖,但使其隱藏改善的事情了一下:

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

然後,而不是調用addSubview當你想表現出來,只是做:

viewController.view.hidden = NO; 

我在視圖中使用UIViewAnimationTransitionFlipFromRight等轉換進行動畫處理時,使用了此方法。即使強制延遲加載視圖仍然有一個明顯的滯後,所以我用它來改善性能。

+0

謝謝,這做到了。 – iamj4de 2010-01-20 19:33:04

+0

@MarkAmery Apple告訴你不要在文檔中調用-loadView:「你不應該直接調用這個方法,視圖控制器在它的視圖屬性被請求時調用這個方法,但是當前爲nil,這個方法加載或者創建一個視圖,將其分配給視圖屬性。「 – 2013-06-25 07:04:01

+0

@MikeWeller好點 - 我沒有仔細查看文檔,知道這一點。那麼我想我們必須選擇兩個稍微難看的黑客之一。就我而言,我可能會堅持'loadView'只是因爲它更明確,但我承認這不是我認爲的乾淨解決方案。 – 2013-06-26 20:06:23

0

的iOS 9中引入-(void) loadViewIfNeeded

我用

if ([_myVC respondsToSelector:@selector(loadViewIfNeeded)]) { 
    [_myVC loadViewIfNeeded]; 
} else { 
    [_myVC view]; 
} 
相關問題