2012-02-04 77 views
1

我有我的視圖控制器類MyVC從UIViewController類延伸。在指定的初始化我改變背景顏色以綠色環保爲以下UIViewController指定的初始值設定項vs loadView方法

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     [self.view setBackgroundColor:[UIColor greenColor]]; 
    } 
    return self; 
} 

我也有,創建一個新的UIView對象,並改變其顏色爲紅色

- (void)loadView 
{ 
    UIView* view = [[UIView alloc]initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [view setBackgroundColor:[UIColor redColor]]; 
    [self setView:view]; 
    [view release]; 
} 

指定初始化被稱爲的loadView方法在loadView調用之前。所以我期望我的視圖顏色(我在指定的初始化程序中設置了綠色)應該變成RED(我在loadView中做的)。 我看到我的顏色是綠色的,如果我在指定的初始化程序中註釋到綠色的顏色線,我會看到紅色。那麼爲什麼它不覆蓋loadView方法中的視圖屬性,如果它是在初始化器之後調用的?

回答

3

-loadView的目的是,呃加載視圖。當您訪問視圖控制器的view屬性並且該屬性的值爲零時會調用它。在這種情況下,您在初始化程序中訪問self.view,所以在調用-loadView時。在發生這種情況後,您設置視圖的背景,以便視圖以綠色背景結束。

+0

我不明白如何在我的初始化我分配視圖self.view?調用[self.view setBack ...] API會隱式執行嗎? – theiOSguy 2012-02-04 02:45:31

+0

順便說一句,我證實在這種情況下laodView被調用。也沒有在我的初始化程序中,我將視圖設置爲self.view。 – theiOSguy 2012-02-04 02:51:54

+1

對不起 - 應該解釋一下。 UIViewController被設置爲懶惰地創建它的視圖。它不會在需要之前創建視圖。無論何時訪問'self.view'和'view'爲零,視圖控制器都會加載視圖。 @robmayoff是正確的 - 它確實會調用'-loadView'來完成這個任務,但是它可以在你訪問'self.view'的地方執行,在這種情況下,它就在你的初始化器中間。之後,您設置'self.view'的背景色,這就是您的視圖具有綠色背景的原因。 – Caleb 2012-02-04 03:18:25

9

Caleb幾乎沒錯。當您訪問視圖控制器的view屬性時,view訪問器方法會檢查視圖是否已加載。如果不是,則調用loadView,然後viewDidLoad,然後返回該視圖。

這條線的初始訪問view屬性:

[self.view setBackgroundColor:[UIColor greenColor]]; 

所以返回認爲,view訪問調用你loadView方法。您的loadView方法將視圖的背景顏色設置爲紅色。然後您的初始化程序將背景顏色設置爲綠色。

如果您灑在你的初始化和你loadView方法有些NSLog S,或者如果你把一個斷點在你loadView方法,你會看到loadViewview,這是從initWithNibName:bundle:稱爲調用。

+0

謝謝搶劫。很好的解釋,而這正是發生的事情。 – theiOSguy 2012-02-04 02:54:03

+1

+1 Well說... – Caleb 2012-02-04 03:20:44

相關問題