Разработка iOS: как я могу предварительно загрузить контроллер представления, прежде чем нажимать его на стек навигации?
Я погружаюсь в разработку iOS, и я создаю игру-головоломку, чтобы помочь мне познакомиться с платформой. У меня есть AdWhirl, показывая рекламу на экране оценки, который отображается, когда пользователь завершает головоломку. Проблема в том, что для просмотра и приема объявления требуется просмотр по меньшей мере нескольких секунд, когда пользователь просматривает счет и переходит на другое представление. Я планирую реализовать анимацию, которая возникает, когда пользователь решает загадку и время, необходимое для завершения анимации, будет хорошим временем для запроса и получения объявления, которое будет отображаться в следующем (оценка) пользователя также будут приняты.
В течение времени, когда происходит разрешенная головоломка, как я могу предварительно загрузить следующий контроллер представления, чтобы объявление присутствовало, когда я нажимаю контроллер представления на стек навигации? Если это невозможно, или если это плохая идея, есть ли у вас какие-либо предложения о том, как я могу запрашивать и получать объявление во время анимации?
Большое спасибо за вашу мудрость!
Примечание. Для тех, кто не знаком с AdWhirl, процесс запроса и получения объявления прост. В методе viewDidLoad контроллера представления вы хотите, чтобы объявление появилось, вы создаете AdWhirlView (подкласс UIView), добавьте его как subview и вызовите метод, который запрашивает объявление. Когда объявление поступит, он вызывает метод делегата, чтобы отобразить его в родительском представлении.
Ответы
Ответ 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()
. Я считаю, что он был первоначально предназначен для модульного тестирования контроллеров представлений, но он должен работать и для этого случая.