[英]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.