2012-04-13 28 views
27

Copié una clase de controlador de vista de trabajo de otro proyecto en un proyecto nuevo. No puedo ver la vista para cargar en el nuevo proyecto. En el proyecto anterior, utilicé presentModalViewController. En el nuevo no puedo obtener la vista para cargar usando presentModalViewController o presentViewControllerNo se puede obtener presente ViewController para trabajar

Estoy tratando de cargar el presente la vista desde mi controlador de vista principal.

Aquí es lo que mi interfaz principal controlador de vista se parece a ...

// ViewController.h 
#import <UIKit/UIKit.h> 
#import "RequestDialogViewController.h" 

@interface ViewController : UIViewController <RequestDialogViewControllerDelegate> { 

} 

- (void)requestDialogViewDidDismiss:(RequestDialogViewController *)controller withResponse:(NSString*)response; 

estoy usando presentModalViewController así ...

RequestDialogViewController *requestIPViewController = [[RequestDialogViewController alloc] initWithNibName:@"RequestDialogViewController" bundle:nil]; 
navigationController = [[UINavigationController alloc] initWithRootViewController:requestIPViewController]; 
[self presentModalViewController:navigationController animated:YES]; 

y presentViewController así ...

RequestDialogViewController *requestIPViewController = [[RequestDialogViewController alloc] initWithNibName:@"RequestDialogViewController" bundle:nil];  
[self presentViewController:requestIPViewController animated:YES completion:nil]; 

¿Qué me estoy perdiendo en el nuevo proyecto? El método init se dispara, pero viewDidLoad no y no se muestra nada.

Gracias

Respuesta

73

Si ViewController es el controlador de vista raíz, no puede presentar un controlador de vista modal desde su propio viewDidLoad, porque en ese momento no tiene información como el tamaño de pantalla.

Si ya se han mostrado otros controladores de vista, esto funcionará. Si el controlador de vista raíz es UINavigationController, verá una vista deslizándose desde la derecha, mientras que la vista modal se desliza hacia arriba desde la parte inferior.

De todos modos, para su ViewController, lo más pronto que podría presentarlo es después de que se haya vuelto visible. Usar un temporizador para esto no es confiable; los dispositivos más viejos y más lentos tienen tiempos de carga dramáticamente más largos.

Para mayor confiabilidad, implemente viewDidAppear: para ViewController. Todavía use su sistema de temporizador para agregar un retraso adicional; una fracción de segundo debería ser suficiente. Aunque la presentación del controlador de vista modal desde el interior de viewDidAppear funcionó en el simulador iOS 5.1, Presenting a modal view controller when loading another ViewController dice que a veces no sucede.

+3

Wow, esto era no es obvio para mi Pasé algún tiempo tratando de resolver esto. Gracias. – rjgonzo

+0

Si esto ocurre al iniciarse la aplicación, ¿aún no hay un parpadeo del controlador de vista de presentación antes de que se muestre el controlador de vista presentado? De cualquier forma alrededor de esto? Consulte http://stackoverflow.com/questions/14739461/how-do-you-transition-in-a-new-non-model-view-controller-without-using-uinavigat/14739540#14739540 para el contexto. – Marplesoft

+0

Este sigue siendo el caso para iOS 10 Xcode 8 Swift 2.3. ¡Gracias! – justColbs

0

presente un modalViewController:

Para el beneficio de todos los programadores de partida, escribe, en vez de copiar y pegar.

myVC *viewController = [[myVC alloc]initWithNibName:@"myVC" bundle:nil]; 
viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentModalViewController:viewController animated:YES]; 
[viewController release]; 

Parece como si estuviera tratando de presentar un controlador de navegación como un controlador de vista en la primera muestra, a continuación, que estaba utilizando el método equivocado en el segundo.

+0

En realidad está en lo cierto con respecto a la presentModalViewController. Lo copié incorrectamente de mi código de trabajo. Sin embargo, realmente quería que el presente ViewController funcionara ya que presentModalViewController está en desuso. Lo hice funcionar ... Ver mi respuesta a continuación. – user278859

+2

Para referencia futura, no copie/pegue la programación. –

4

Lo he resuelto. Estaba tratando de presentar la vista desde la vista hizo la carga del controlador de vista principal. No sé por qué no funciona allí, sino que ahora estoy poniendo un temporizador que llama a un método para presentar el controlador de vista después de que las principales cargas vista y funciona bien ahora usando ...

[self presentViewController:requestIPViewController animated:YES completion:nil]; 

Gracias a aquellos quien respondió

+0

Este método solo está disponible en iOS 6 y más allá de –

+4

@NathanielSymer. No creo que sea correcto. Los documentos dicen que presentViewController: animated: completion: es iOS5 y superior. Consulte http://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/presentViewController:animated:completion: – Marplesoft

0

Tuve el mismo problema. Pero mi situación es el presentViewController se llama después del dismissViewControllerAnimated para otro ViewController.Mi solución es mover el presentViewController al bloque de finalización de dismissViewControllerAnimated.

+0

Tiene sentido. porque debe descartar un controlador antes de presentar otro. –

2

Como @Dondragmer dijo, si desea presentar su viewController en viewDidLoad de la vista raíz, fallará. Una vez que su viewController esté listo para eso, puede presentar su nuevo viewController. lo tanto, puede hacer que en

- (void)viewDidLayoutSubviews { 
    //present here 
} 
+1

^depende de cuántas veces quieras presentarlo :) El punto de ruptura del depurador de Da mostró que se llamaba un par de veces en rápida sucesión. –

Cuestiones relacionadas