我有一个名为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
?
答案 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即可。