Подтвердить что ты не робот

Разработка iOS: как я могу предварительно загрузить контроллер представления, прежде чем нажимать его на стек навигации?

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

  UIView *view = myViewController.view;

или

  UIView *view = [myViewController view];

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

Ответ 3

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

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

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

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

Ответ 4

Поместите это на свой делегат 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 сделает всю нагрузку в фоновом режиме.

Ответ 5

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