UIViewController中的ViewDidLoad方法 – 什么时候被调用?
我有一个名为LaunchController的UIViewController
,在应用程序第一次打开时在我的iPhone应用程序中启动:
@interface LaunchController : UIViewController<UINavigationControllerDelegate, UIImagePickerControllerDelegate>
然后,当一个button被点击,我推另一个视图控制器:
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
永远不会被调用,即使我正在调用presentModalViewController
。 为什么是这样? 为什么不调用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文件的话你可以创build视图控制器的视图)。
因此,你的视图没有被加载,所以viewDidLoad永远不会被调用。
通常你会使用initWithNibName:
来初始化一个新的视图控制器,然后在它之后设置图像(所以将图像作为属性公开)。
viewDidLoad会在控制器的view属性被访问的时候被调用,也就是当你第一次显示或者请求它的时候(比如有一些调用c.view
代码)。
viewDidLoad没有被调用的原因是因为你没有加载视图。
在你的init方法中:
self = [super init];
意味着你只是从头开始创build一个裸视图。 不从笔尖加载一个。
试试这个:
self = [super initWithNibName:nil bundle:nil];
如果你有一个与视图控制器类同名的xib或nib文件,它应该findif。 否则,你可以给一个nibName工作。
更新:
如果你不使用nib文件,那么适当的方法是不viewDidLoad。 你必须实现loadView
而不是viewDidLoad
。
在你的具体情况下,只需将当前在viewDidLoad中的所有内容放入loadView。