UIViewController中的ViewDidLoad方法 - 什么时候被调用?

时间:2012-01-16 06:04:41

标签: iphone ios uiviewcontroller

我有一个名为LaunchController的UIViewController,当应用程序首次打开时,它会在我的iPhone应用程序中启动:

@interface LaunchController : UIViewController<UINavigationControllerDelegate, UIImagePickerControllerDelegate>

然后,当单击一个按钮时,我按下另一个视图控制器:

 MainController *c = [[MainController alloc] initWithImage:image];
 [self presentModalViewController:c animated:NO];

MainController有以下构造函数,我使用它:

- (id)initWithImage:(UIImage *)img
{
    self = [super init];
    if (self) {
        image = img;
        NSLog(@"inited the image");
    }

    return self;
}

然后它有一个viewDidLoad方法如下:

- (void)viewDidLoad
{
    NSLog(@"calling view did load");
    [super viewDidLoad];

    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    [self.view addSubview:imageView];
    NSLog(@"displaying main controller");
}

当程序运行时,我看到MainController的构造函数被调用(由于NSLog的输出),但viewDidLoad永远不会被调用,即使我正在调用{ {1}}。为什么是这样?为什么不调用presentModalViewController

3 个答案:

答案 0 :(得分:4)

我认为这是以下内容。当您在UIViewController中需要view的属性时,它将以惰性方式加载。

- (UIView *)view 
{
   if (_view == nil) {
      [self loadView]; //< or, the view is loaded from xib, or something else.
      [self viewDidLoad];
   }

   return _view;
} 

初始化view后,会致电viewDidLoad通知UIViewController

答案 1 :(得分:3)

您没有从xib文件加载视图控制器,也没有在loadView中没有任何内容的注释(如果您没有使用xib文件,那么您将在此处创建视图控制器的视图)。

因此,您的视图未加载,因此从不调用viewDidLoad。

通常,您将使用initWithNibName:初始化新的视图控制器,然后在其后设置图像(将图像作为属性公开)。

一旦访问了控制器的视图属性,就会调用viewDidLoad,即第一次显示或请求它时(例如,有一些代码调用c.view

答案 2 :(得分:0)

未调用viewDidLoad的原因是因为您没有加载视图。

在你的init方法中:

 self = [super init];

意味着您只是从头开始创建裸视图。不从笔尖加载。

试试这个:

self = [super initWithNibName:nil bundle:nil];

如果你有一个与视图控制器类同名的xib或nib文件,它应该找到。否则,你可以给一个有效的nibName。

更新:

如果您没有使用nib文件,那么相应的方法不是viewDidLoad。您必须实施loadView而不是viewDidLoad

在您的特定情况下,只需将当前在viewDidLoad中的所有内容放入loadView即可。