Метод ViewDidLoad в UIViewController - когда он вызывается? - PullRequest
7 голосов
/ 16 января 2012

У меня есть UIViewController под названием LaunchController, который запускается в моем приложении для 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 никогда не вызывается, даже если я вызываю presentModalViewController. Почему это? Почему не звонят viewDidLoad?

Ответы [ 3 ]

4 голосов
/ 16 января 2012

Я думаю, что это что-то вроде следующего. Когда вам нужно свойство view внутри UIViewController, оно будет загружаться ленивым способом.

- (UIView *)view 
{
   if (_view == nil) {
      [self loadView]; //< or, the view is loaded from xib, or something else.
      [self viewDidLoad];
   }

   return _view;
} 

После инициализации view он вызовет viewDidLoad, чтобы сообщить UIViewController.

3 голосов
/ 16 января 2012

Вы не загружаете свой контроллер представления из файла xib, и из комментариев у вас ничего нет в loadView (именно там вы бы создали представление вашего контроллера представления, если бы вы не использовали файл xib).

Следовательно, ваше представление не загружается, поэтому viewDidLoad никогда не вызывается.

Как правило, вы используете initWithNibName: для инициализации нового контроллера представления, а затем устанавливаете изображение после него (поэтому выставьте изображение как свойство).

viewDidLoad будет вызываться, как только будет получен доступ к свойству view вашего контроллера, то есть когда вы впервые отображаете его или запрашиваете его (например, есть некоторый код, который вызывает c.view.

0 голосов
/ 16 января 2012

Причина, по которой viewDidLoad не вызывается, заключается в том, что вы не загружаете представление.

В вашем методе init:

 self = [super init];

означает, что вы просто создаете голое представление изцарапина.не загружать один из пера.

попробуйте вместо этого:

self = [super initWithNibName:nil bundle:nil];

Если у вас есть файл xib или nib с тем же именем, что и у класса контроллера представления, он должен найти if.В противном случае вы можете просто указать работающее nibName.

ОБНОВЛЕНИЕ:

Если вы не используете nib-файлы, то соответствующий метод НЕ viewDidLoad.Вы должны реализовать loadView вместо viewDidLoad.

В вашем конкретном случае просто поместите все, что в данный момент находится в viewDidLoad, в loadView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...