UIViewController指定初始化器vs loadView方法

the*_*guy 1 uiviewcontroller uiview ios

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

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

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

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

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

rob*_*off 9

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

初始化程序中的这一行访问view属性:

    [self.view setBackgroundColor:[UIColor greenColor]];
Run Code Online (Sandbox Code Playgroud)

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

如果你NSLog在初始化器和loadView方法中撒了一些s ,或者你在loadView方法中放了一个断点,你会看到loadView调用from view,调用from initWithNibName:bundle:.