Кто должен вызывать viewDidLoad для программно загруженных представлений? - PullRequest
1 голос
/ 23 мая 2009

Когда мне нужно загрузить представление программно, я делаю следующее:

MyController* myController = [[MyController alloc] init];
[[NSBundle mainBundle] loadNibNamed:@"myNib" owner:myController options:nil];
// use my controller here, eg. push it in the nav controller

Это работает нормально, но viewDidLoad моего контроллера никогда не вызывается. Поэтому я прибегнул к ручному вызову после вызова loadNibNamed, но это не совсем правильно. Я ожидал, что фреймворк вызовет viewDidLoad от моего имени. Это правильный путь или я что-то упустил?

Ответы [ 4 ]

5 голосов
/ 30 мая 2011

Я новичок в Stack Overflow, но я обнаружил этот вопрос и обнаружил пару других методов для загрузки файла пера, которые гарантируют, что метод viewDidLoad вызывается автоматически. Ответ Эд Марти правильный, но он требует, чтобы вы вышли за пределы кода ViewController для загрузки nib-файла. Эти два примера, которые я предлагаю здесь, позволяют вам сохранить ваш код в реализации ViewController. Не обязательно лучшие способы, просто разные. Если вы знаете о каких-либо недостатках такого подхода, пожалуйста, дайте мне знать ваши мысли.

Во-первых, внутри initWithNibName: bundle: метод вашего подкласса UIViewController, вы можете заменить вызов:
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

с чем-то вроде этого:
self = [super initWithNibName:@"NameOfAlternateNibFile" bundle:nibBundleOrNil];

Или вы можете выполнить то же самое, выполнив следующее:

[[NSBundle mainBundle] loadNibNamed:@"NameOfAlternateNibFile" owner:self options:nil];
[self setView:self.view]; //this line ensures that the viewDidLoad method is called

Ключ к пониманию того, что написано в комментариях над определением функции для $initWithNibName:bundle: в файле UIViewController.h (включен внизу моего ответа здесь, см. Курсив).

Хорошая вещь при использовании любого из этих методов заключается в том, что viewDidLoad вызывается в любом сценарии.

Вот директивы, перечисленные в UIViewController.h:

Назначенный инициализатор. если ты подкласс UIViewController, вы должны назвать супер реализацию этого метод, даже если вы не используете СИБ. (Для удобства, по умолчанию Метод init сделает это за вас, и укажите nil для обоих методов аргументы.) В указанном NIB, Владелец файла прокси должен иметь свой класс установлен для вашего контроллера представления подкласс, с представлением розетки подключен к основному виду. если ты вызвать этот метод с ноль пера имя, то этот класс '-loadView метод попытается загрузить NIB чье имя совпадает с вашим взглядом класс контроллера. Если нет такого NIB в факт существует тогда вы должны либо call -setView: перед -view вызвано или переопределите метод -loadView для программной настройки ваших представлений. - (id) initWithNibName: (NSString *) пакет nibNameOrNil: (NSBundle *) nibBundleOrNil;

3 голосов
/ 24 мая 2009

Вы должны загрузить контроллеры вида с

MyController* myController = [[MyController alloc] initWithNibName:@"myNib" bundle:nil];

Убедитесь, что ваш MyController выходит из UIViewController, а свойство View правильно установлено в Интерфейсном Разработчике.

1 голос
/ 24 мая 2009

Представления загружаются лениво UIViewController. Если вы используете аксессор myController.view в вашем коде, представление должно быть загружено и вызываться viewDidLoad.

0 голосов
/ 13 апреля 2010

Я заметил то же самое. Я думаю, ViewDidLoad должен вызываться КОНТРОЛЛЕРОМ представления. Так как у вас нет view-control в вашем nib, вы должны вызвать viewdidload вручную. Я должен сделать то же самое.

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