Iphone UIViewController中的ViewDidLoad方法-何时调用它?

Iphone UIViewController中的ViewDidLoad方法-何时调用它?,iphone,ios,uiviewcontroller,Iphone,Ios,Uiviewcontroller,我有一个名为LaunchController的UIViewController,它在我的iPhone应用程序首次打开时启动: @interface LaunchController : UIViewController<UINavigationControllerDelegate, UIImagePickerControllerDelegate> MainController具有以下构造函数,我使用该构造函数: - (id)initWithImage:(UIImage *)img

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

@interface LaunchController : UIViewController<UINavigationControllerDelegate, UIImagePickerControllerDelegate>
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
从未被调用,即使我正在调用
presentModalViewController
。为什么会这样?为什么没有调用
viewDidLoad

您没有从xib文件加载视图控制器,并且从注释中加载的视图控制器在loadView中没有任何内容(如果您没有使用xib文件,您将在这里创建视图控制器的视图)

因此,未加载视图,因此从未调用viewDidLoad

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


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

),viewDidLoad将被调用。没有调用viewDidLoad的原因是因为您没有加载视图

在init方法中:

 self = [super init];
这意味着您只是从头开始创建裸视图,而不是从笔尖加载

请尝试以下方法:

self = [super initWithNibName:nil bundle:nil];
如果您有一个与视图控制器类同名的xib或nib文件,它应该找到If。否则,您可以只给出一个工作的nibName

更新:

如果您没有使用nib文件,则适当的方法不是viewDidLoad。您必须实现
loadView
,而不是
viewDidLoad


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

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

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

   return _view;
} 
-(UIView*)视图
{
如果(_view==nil){
[self-loadView];//<或者,该视图是从xib或其他文件加载的。
[自视下载];
}
返回视图;
} 

视图
初始化后,它将调用
viewDidLoad
通知
UIViewController

主控制器是否实现了
loadView
方法?否。在loadView中应该怎么做?如果新视图已启动,实际上不会检查它。将NSLog移到if括号内,查看视图是否已初始化是的,它是初始化的。我移动了它,它仍然打印它。您的项目中有名为
MainController.xib
的nib吗?如果没有,您必须重写
-loadView
,并提供空视图。但我没有使用nib,我想以编程方式创建视图。更新。阅读UIViewController的文档以了解更多详细信息cs关于loadView。但我没有使用xib或InitWithNIB,这将是您的问题中包含的有用信息。请不要这样做。Apple文档明确指出,不应直接调用loadView和viewDidLoad。从
loadView
:“您不应直接调用此方法。”@你说得对。但我只是用上面的代码来描述调用
-viewdiload
的时间。
- (UIView *)view 
{
   if (_view == nil) {
      [self loadView]; //< or, the view is loaded from xib, or something else.
      [self viewDidLoad];
   }

   return _view;
}