UIViewController指定初始化器vs loadView方法

时间:2012-02-04 02:29:15

标签: ios uiview uiviewcontroller

我的视图控制器类MyVC从UIViewController类扩展。在指定的初始化程序中,我将背景颜色更改为绿色,如下所示

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

我还有loadView方法,它创建一个新的UIView对象并将其颜色更改为RED

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

在loadView调用之前调用指定的初始值设定项。所以我希望我的视图颜色(我在指定的初始化程序中设置GREEN)应该变为RED(我在loadView中做过)。 我看到我的颜色为绿色,如果我在指定的初始化器中评论绿色线,那么我会看到红色。那么,如果在初始化程序之后调用它,为什么不覆盖loadView方法中的视图属性?

2 个答案:

答案 0 :(得分:9)

迦勒几乎是对的。当您访问视图控制器的view属性时,view访问器方法会检查视图是否已加载。如果没有,则调用loadView,然后调用viewDidLoad,然后返回视图。

初始值设定项中的这一行访问view属性:

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

因此,要返回视图,view访问者会调用您的loadView方法。您的loadView方法将视图的背景颜色设置为红色。然后您的初始化程序将背景颜色设置为绿色。

如果您在初始化程序和NSLog方法中撒了一些loadView,或者在loadView方法中放了一个断点,您会看到loadView是从view调用,从initWithNibName:bundle:调用。

答案 1 :(得分:3)

-loadView的目的是,呃,加载视图。当您访问视图控制器的view属性并且该属性的值为nil时,会调用它。在这种情况下,您可以在初始值设定项中访问self.view,以便在-loadView被调用时使用{{1}}。在此情况发生后设置视图的背景,因此视图以绿色背景结束。