loadView和viewDidLoad有什么区别?

时间:2010-08-06 12:38:13

标签: iphone objective-c

我知道这个问题看似完全相同:iPhone SDK: what is the difference between loadView and viewDidLoad? 但是,我已经阅读了这个问题,但仍未完全回答。 我没有使用IB,因为UI是动态的。

我应该创建self.view,然后在loadView中添加子视图。

或者我应该在loadView中创建self.view并在viewDidLoad中添加子视图?#

7 个答案:

答案 0 :(得分:15)

从NIB加载视图并希望在启动后执行进一步的自定义时,请使用viewDidLoad。

如果要以编程方式创建视图(不使用Interface Builder),请使用loadView。

答案 1 :(得分:2)

对于您的具体问题,您应该在viewDidLoad中添加子视图。因为,如果覆盖loadView,则必须执行所有作业,加载所有视图。

以下是Apple's documentation的解释:

加载周期中发生的步骤如下:

  

1

  * Some part of your application asks for the view in the view
     

控制器的视图属性。

     

2

  * If the view is not currently in memory, the view controller calls its loadView
     

方法

     

3

  * The loadView method does one of the following:

        If you override this method, your implementation is
     

负责创建所有   必要的观点和分配   视图属性的非零值。

        If you do not override this method, the default implementation uses 
     

视图控制器的nibName和nibBundle属性,用于尝试加载视图   从指定的nib文件。如果   它没有找到指定的nib文件   查找名称为的nib文件   匹配视图的名称   控制器类和加载该文件。

        If no nib file is available, the method creates an empty UIView object 
     

并将其分配给view属性。

     

4

  * The view controller calls its viewDidLoad method to perform any
     

额外的加载时间任务。

答案 2 :(得分:2)

实际上非常简单。如果你在没有IB的情况下这样做,那么你的UIViewController的view属性是空的。所以将它设置为loadView!

我只在loadView上设置视图而没有别的。

除此之外,在viewDidLoad中执行所有操作。这是一些例子:

- (void)loadView {
    CGRect frame = [[UIScreen mainScreen] applicationFrame];
    baseView = [[UIView alloc] initWithFrame:frame];
    [self setView:baseView];
    [baseView release];
}

就是这样!我做完。并且永远不会想要添加更多。然后在viewDidLoad中,我添加了我想要的所有子视图。

- (void)viewDidLoad {
    [super viewDidLoad];

    msg = [[UILabel alloc] initWithFrame:CGRectMake(0, 200, 320, 50)];
    [msg setText:@"Your profile is empty!"];
    [[self view] addSubview:msg]; // hey, I have done my view at loadView, so I have it now
    [msg release];
}

我的理解可能是错的:)。

答案 3 :(得分:0)

在viewDidLoad中添加子视图。这样你就可以100%确定视图确实加载并准备好消费了。

答案 4 :(得分:0)

loadView是实际设置视图的方法(设置所有出口,包括self.view)。

viewDidLoad你可以通过它的名字弄清楚。这是在加载视图(已设置所有插座)后调用的委托方法,它只是通知控制器它现在可以开始使用插座。

viewDidLoad中: “在视图控制器将其关联的视图加载到内存中之后调用此方法。无论视图是存储在nib文件中还是以编程方式在loadView方法中创建,都会调用此方法。”

的loadView: “如果您手动创建视图,则必须覆盖此方法并使用它来创建视图。”

答案 5 :(得分:0)

使用viewDidLoad初始化视图和控制。如果您没有Nib / Xib并且希望ViewController具有自定义(不是loadView)视图,请使用UIView

答案 6 :(得分:0)

仅当您要自己创建视图时才使用loadView。

在使用接口生成器或对nib进行初始化之后,请勿使用loadView,因为这些操作已在底层实现中调用了loadView。

此外,在使用loadView时,请先分配视图,然后再进行其他任何设置:

    -(void)loadView {
       [super loadView];
       // if you do any things here before assigning a view
       // it will try to get a view first by calling loadView()
       // and ends up with a crash since a dead loop.          
       self.view = ...;//assign your view here
       //do other settings
    }