Метод 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.