Обеспечение полной настройки UIViewController перед вызовом loadView - PullRequest
0 голосов
/ 23 октября 2011

Существует UIViewController, который использует UIImageView, и этот вид изображения инициализируется данными изображения (NSData).Он не использует XIB, но создает свое представление программно:

- (void)loadView
{
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithData:self.imageData]];
    scrollView = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    scrollView.contentSize = imageView.bounds.size;
    scrollView.delegate = self;
    [scrollView addSubview:scrollView];
}

Эти данные должны быть установлены другим контроллером, который alloc s, init s, и помещает этот контроллер представления в навигациюконтроллер:

ImageViewController *imageViewController = [ImageViewController alloc] init];
imageViewController.imageData = someData;
[self.navigationController pushViewController:imageViewController animated:YES];

Как я узнаю, что все, что нужно сделать, что в данном случае устанавливает данные, выполняется до вызова loadView?Или я не знаю, и мне нужно создать собственный инициализатор, или как-то снова вызвать loadView, когда контроллер представления получает данные?

Я сталкивался со многими подобными ситуациями, когда я не понимал, что будетслучается, например, с UITableViewController с.

Ответы [ 2 ]

1 голос
/ 23 октября 2011

loadView будет происходить при доступе к свойству view контроллера представления. Код, который вы написали, будет работать нормально, потому что при первом обращении к свойству view будет где-то внутри pushViewController.

Если бы вы написали это, у вас возникла бы проблема:

ImageViewController *imageViewController = [ImageViewController alloc] init];
NSLog(@"size = (%.0f, %.0f)", imageViewController.view.frame.size.width,
                              imageViewController.view.frame.size.height);
imageViewController.imageData = someData;
[self.navigationController pushViewController:imageViewController animated:YES];

потому что вы обращаетесь к свойству view в NSLog. Это приведет к вызову loadView до установки imageData.

1 голос
/ 23 октября 2011

Откуда мне знать, что все, что нужно сделать, что в данном случае устанавливает данные, выполняется до вызова loadView?

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

Кроме того, правильное место для присвоения imageData вашему виду изображения, вероятно, viewDidLoad («Если вы хотите выполнить дополнительную инициализацию ваших видов, сделайте это с помощью метода viewDidLoad.»). И ваш loadView метод не будет делать ничего видимого в его текущей форме. Вы должны назначить представление для свойства view контроллера представления в этом методе.

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