簡體   English   中英

UIViewController中的ViewDidLoad方法 - 什么時候被調用?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM