繁体   English   中英

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

[英]ViewDidLoad method in UIViewController - when does it get called?

我有一个名为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的输出),但是,即使我调用presentModalViewController ,也不会调用viewDidLoad 为什么是这样? 为什么不调用viewDidLoad

我认为这有点如下。 当您需要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

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

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

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

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

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

在你的init方法中:

 self = [super init];

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

试试这个:

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

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

更新:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM