UIViewController -viewDidLoad не вызывается - PullRequest
30 голосов
/ 27 мая 2009

Будучи новичком в Какао, у меня есть несколько проблем с Interface Builder, UIViewController и друзьями.

У меня есть подкласс UIViewController с UIView, определенным в xib, и с выходом вида контроллера, связанным с видом. «Владелец файла» XIB установлен как myViewcontroller подкласс.

В этом случае следующий код для загрузки контроллера / представления (из контроллера основного вида) не работает должным образом:

if ( self.myViewController == nil )
{
    self.myViewController = [[MyViewController alloc]
        initWithNibName:@"MyViewController" bundle:nil];
}

[self.navigationController 
    pushViewController:self.myViewController animated:YES];

В методах MyViewController я разместил точки останова и регистрирую сообщения, чтобы увидеть, что происходит:

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {

    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        NSLog(@"initWithNibName\n");
    }

    return self;
}

-(void)viewDidLoad {

    [super viewDidLoad];
    NSLog(@"viewDidLoad\n");
}

Ожидаемый результат

Вызываются оба метода -initWithNibName и -viewDidLoad, и отображается представление myViewController.

Наблюдаемый результат

вызывается только -initWithNibName, вид не отображается.

Я что-то пропустил? Кто-нибудь может порекомендовать что-нибудь проверить? (Особенно в удивительно непрозрачном инструменте Interface Builder).

Ответы [ 9 ]

32 голосов
/ 30 августа 2010

RE: РЕШЕНИЕ НАЙДЕНО !!!!!

Действительно, это кажется рабочим решением, однако реальная хитрость не в том, чтобы установить для свойства view.hidden значение NO, что делает загрузку представления из nib-файла вызовом метода представления UIViewController's, представления загружается из пера только при первом вызове метода view.

В этом смысле простое сообщение [viewController view] вынудит загрузку представления из файла пера.

14 голосов
/ 27 мая 2009

Хорошо, у меня есть частичный ответ - может быть, гуру могут объяснить еще немного. Проблема:

[self.navigationController pushViewController:myViewController animated:YES];

Если присмотреться поближе, то в данном случае self.navigationController равно нулю, поэтому push-сообщение не идет никуда.

Вместо этого, если я отправлю:

[self.view addSubview:self.myViewController.view];

Затем появляется представление и вызывается -viewDidLoad.

Я не совсем уверен, почему self.navigationController не установлен в этом случае - единственное, о чем я могу думать, это то, что self является подклассом UIViewController, а не UITableViewController (где pushViewController код пришел)

Кроме того, молчаливое разрешение отправлять сообщения на ноль кажется плохой идеей, хотя эти ответы говорят об обратном. Смотрите также мой вопрос здесь .

Окончательное редактирование:

Ответы в комментариях ниже, я понял, что функция отображения, за которой я на самом деле следовал (учитывая, что myViewController является модальной):

[self presentModalViewController:myViewController animated:YES];

Спасибо всем за полезные ответы.

8 голосов
/ 15 января 2010

РЕШЕНИЕ НАЙДЕНО !!!!!

Даже что-то столь безобидное, как это делает вызов метода viewDidLoad.

Вставьте это сразу после alloc initWithNibName

viewController.view.hidden = NO; //calls viewDidLoad
5 голосов
/ 11 мая 2016

Возможно, вы не связали предполагаемое ViewController в main.storyboard из Identity Inspector с пользовательским class, который вы создали. Возможно, вы сможете перейти к этому контроллеру из других контроллеров представления через сегменты, но любой из viewDidLoad(), viewWillAppear() и т. Д. Не будет выполнен.

5 голосов
/ 04 марта 2012

Просто используйте

- (void)viewDidAppear:(BOOL)animated{ 
        [super viewDidAppear:animated];
        //Your Code here
  }

вместо метода viewDidLoad.

4 голосов
/ 27 мая 2009

Для меня это похоже на проблему с капитализацией. Вы ссылаетесь на класс MyViewController вместо свойства myViewController в вызове pushViewController.

4 голосов
/ 27 мая 2009

убедитесь, что точка просмотра в Владельце файла (ваш подкласс viewController) подключена к реальному виду (т. Е. Холсту 480X320, который вы видите на экране и используете для создания своего пользовательского интерфейса)

2 голосов
/ 18 октября 2015

Другая причина, несколько очевидная в ретроспективе: если в коде установлено viewController.view, то событие viewDidLoad не сработает.

2 голосов
/ 27 мая 2009

Проверьте журнал выполнения на наличие ошибок. Почти наверняка NIB не загружается, и в этом случае должна быть ошибка. Наиболее вероятной причиной этого является невозможность поместить его в комплект. Посмотрите на этапе сборки «Копирование ресурсов» и убедитесь, что XIB действительно копируется. Выполните сборку для симулятора и перейдите в каталог сборки и убедитесь, что NIB находится в комплекте .app.

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