Метод ViewDidLoad в UIViewController-когда он вызывается?

у меня есть 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 ответов


Я думаю, что это что-то как followings. Когда вам нужно свойство 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.


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

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

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

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


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

в методе init:

 self = [super init];

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

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

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

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

обновление:

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

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