2010-12-19 7 views
12

Estoy inmerso en el desarrollo de iOS y estoy construyendo un juego de rompecabezas para ayudarme a familiarizarme con la plataforma. Tengo AdWhirl mostrando anuncios en la pantalla de puntuación que se muestra cuando el usuario completa un rompecabezas. El problema es que el controlador de vista de pantalla de puntuación tarda al menos unos segundos en solicitar y recibir el anuncio, momento en el que el usuario observa el puntaje y pasa a una vista diferente. Estoy planeando implementar una animación que ocurre cuando el usuario resuelve un acertijo y el tiempo que demora en terminar la animación sería un buen momento para solicitar y recibir el anuncio que se mostrará en el siguiente (puntaje) ver al usuario será tomado tambiénDesarrollo de iOS: ¿cómo puedo precargar un controlador de vista antes de insertarlo en la pila de navegación?

Durante el tiempo que transcurre la animación resuelta del rompecabezas, ¿cómo puedo precargar el siguiente controlador de vista para que el anuncio esté presente cuando coloco el controlador de vista en la pila de navegación? Si esto no es posible, o si es una mala idea, ¿tiene alguna sugerencia de cómo puedo solicitar y recibir el anuncio mientras se lleva a cabo la animación?

¡Muchas gracias de antemano por su sabiduría!

Nota: Para aquellos que no están familiarizados con AdWhirl, el proceso de solicitar y recibir un anuncio es simple. En el método viewDidLoad del controlador de vista en el que desea que aparezca el anuncio, crea un AdWhirlView (subclase de UIView), agréguelo como subvista y llama a un método que solicita un anuncio. Cuando llega el anuncio, llama a un método de delegado para mostrarlo en la vista principal.

Respuesta

-4

Puede llamar al loadView manualmente, no sé si hay algún efecto secundario, pero no lo creo.

Gracias Tommy, de hecho, al acceder a la propiedad de vista, se asegurará de que loadView solo se invoque efectivamente solo si la jerarquía de vistas no está cargada, evitando cualquier fuga potencial si el código de loadView hace caso omiso de ella.

+13

Hay un efecto secundario potencialmente malo: si la vista ya está cargada, entonces loadView puede causar una fuga. Sería mejor simplemente acceder a la propiedad 'ver' en su controlador de vista (no hay necesidad de hacer mucho con él), lo que hará que cargue la vista si no lo ha hecho ya. – Tommy

+0

¡Gracias! ¡Acceder a la propiedad de vista antes de empujar el controlador de vista a la pila funcionó bien! – BeachRunnerFred

+0

Impresionante. Esto me ayudó mucho hoy, votando. – Richard

29

Hay es un efecto secundario con solo usar [viewController loadView] y es que viewDidLoad no se llamará automáticamente después de que se cargue la vista.

para hacerlo correctamente y para asegurarse de que viewDidLoad se llama, en lugar de llamar loadView sí mismo que puede crear instancias de los UIViewController's vista usando

UIView *view = myViewController.view; 

o

UIView *view = [myViewController view]; 

Ello permitirá tanto la llamada loadView (si la vista no estaba cargada) y viewDidLoad cuando la vista ha terminado de cargarse.

14

En respuesta a la respuesta aceptada, no debe invocar -loadView manualmente. Del documentation:

Nunca debe llamar a este método directamente. El controlador de vista llama al este método cuando se solicita su propiedad de vista, pero actualmente es nula. Este método carga o crea una vista y la asigna a la propiedad de vista.

En su lugar, solo debe llamar a [myViewController view] que activará la vista para cargar.

Como siempre, lea la documentación!

2

poner esto en 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"]; 
       }); 

El dispatch_async hará que toda la carga cosa de su delegado en el fondo.

0

En iOS 9 se agregó un nuevo método loadViewIfNeeded(). Creo que originalmente estaba destinado a pruebas unitarias de controladores de vista, pero también debería funcionar para este caso.

Cuestiones relacionadas