Разработка для iOS: Как я могу предварительно загрузить контроллер представления, прежде чем помещать его в стек навигации? - PullRequest
13 голосов
/ 19 декабря 2010

Я погружаюсь в разработку под iOS и создаю игру-головоломку, которая поможет мне ознакомиться с платформой.У меня есть AdWhirl, отображающий рекламу на экране оценки, который отображается, когда пользователь завершает головоломку.Проблема в том, что контроллеру представления экрана оценки требуется по меньшей мере несколько секунд, чтобы запросить и получить объявление, и в это время пользователь просматривает счет и переходит в другое представление.Я планирую реализовать анимацию, которая возникает, когда пользователь решает головоломку, и время, необходимое для завершения анимации, будет хорошим временем для запроса и получения рекламы, которая будет отображаться при следующем просмотре (оценка) пользователем.будет также взято.

В то время, когда происходит анимация решения головоломки, как я могу предварительно загрузить следующий контроллер представления, чтобы объявление появлялось, когда я нажимаю контроллер представления на навигациюстек?Если это невозможно или если это плохая идея, есть ли у вас какие-либо предложения о том, как я могу запросить и получить объявление во время анимации?

Большое спасибо за вашу мудрость!

Примечание. Для тех, кто не знаком с AdWhirl, процесс запроса и получения рекламы прост.В методе viewDidLoad контроллера представления, в котором вы хотите показывать объявление, вы создаете AdWhirlView (подкласс UIView), добавляете его как подпредставление и вызываете метод, который запрашивает объявление.Когда объявление приходит, оно вызывает метод делегата, чтобы отобразить его в родительском представлении.

Ответы [ 5 ]

30 голосов
/ 17 апреля 2012

Там является побочным эффектом только при использовании [viewController loadView], и это то, что viewDidLoad не будет вызываться автоматически после загрузки представления.

Чтобы сделать это правильно и убедиться, что viewDidLoad вызывается, вместо вызова loadView самостоятельно, вы можете создать экземпляр представления UIViewController с помощью

  UIView *view = myViewController.view;

или

  UIView *view = [myViewController view];

Это вызовет loadView (если представление еще не было загружено), а затем viewDidLoad, когда представление завершит загрузку.

14 голосов
/ 17 апреля 2012

В ответ на принятый ответ вы не должны вызывать -loadView вручную.Из документации :

Вы никогда не должны вызывать этот метод напрямую.Контроллер представления вызывает этот метод, когда запрашивается его свойство view, но в данный момент оно равно nil.Этот метод загружает или создает представление и присваивает его свойству представления.

Вместо этого вам просто нужно вызвать [myViewController view], что приведет к загрузке представления.

Как всегдапрочитайте документацию!

2 голосов
/ 10 июня 2016

Поместите это в application:didFinishLaunchingWithOptions:

  dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
                   UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle:[NSBundle mainBundle]];
                   [storyboard instantiateViewControllerWithIdentifier: @"TheViewControllerYouWantToPreload"];
                 });

вашего делегата. dispatch_async загрузит все это в фоновом режиме.

0 голосов
/ 18 апреля 2017

В iOS 9 был добавлен новый метод loadViewIfNeeded().Я считаю, что изначально он был предназначен для модульного тестирования контроллеров представления, но он должен работать и в этом случае.

0 голосов
/ 19 декабря 2010

Вы можете вызвать loadView вручную, я не знаю, есть ли побочные эффекты, но я так не думаю.

Спасибо, Томми, действительно, доступ к свойству view гарантирует, что loadView будет эффективно вызываться только в том случае, если иерархия представлений еще не загружена, что позволяет избежать любой потенциальной утечки, если код loadView не справится с этим.

...