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