2012-02-04 57 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

相关问题