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