2012-03-03 31 views
7

Estoy tratando de presentar un controlador de vista (una vista de tipo de solicitud de código de acceso) cada vez que mi aplicación se activa. Una vez que se ingresa la contraseña correcta, debe salir de la pila. La vista de código de acceso que estoy tratando de presionar no es el controlador de vista inicial, por lo que tengo problemas para acceder a ella desde la aplicaciónDidBecomeActive de AppDelegate.Presentar un controlador de vista específico desde AppDelegate

También he intentado apretar el punto de vista del código de acceso viewWillAppear de mi MainViewController, pero no se consiga llamar cuando la aplicación se activa; solo cuando la pantalla se actualiza.

He estado investigando problemas similares a través de la pareja, así últimos días, pero todavía no estoy entendiendo el método apropiado. He oído que podría no ser capaz de presionar la vista de esta manera porque se puede llamar a la aplicaciónDidBecomeActive antes de que Storyboard o NavigationController estén conectados/inicializados/etc.

Si alguien me podría dar con la forma correcta para empujar/presentar la vista, o si hay algún otro lugar eso sería mejor que hacer este tipo de cosas, se lo agradecería.

Resuelto: Acabo de eliminar la vista del guión gráfico y usé una plumilla en su lugar. Solía:

PasscodeUnlockVC *passcodeUnlock = [[PasscodeUnlockVC alloc] initWithNibName:@"PasscodeUnlockVC" bundle:[NSBundle mainBundle]]; 
[(UINavigationController *)self.window.rootViewController pushViewController:passcodeUnlock animated:NO]; 

Ver datos de jerarquía:

(gdb) po [[(id)UIApp keyWindow] recursiveDescription] 
<UIWindow: 0x736a4b0; frame = (0 0; 320 480); layer = <UIWindowLayer: 0x7367b40>> 
    | <UILayoutContainerView: 0x76977a0; frame = (0 0; 320 480); autoresize = W+H; layer =  <CALayer: 0x769de60>> 
    | | <UINavigationTransitionView: 0x7692110; frame = (0 0; 320 480); clipsToBounds = YES;  autoresize = W+H; layer = <CALayer: 0x769a8c0>> 
    | | | <UIViewControllerWrapperView: 0x73868d0; frame = (0 64; 320 416); autoresize = W+H; layer = <CALayer: 0x75510e0>> 
    | | | | <UIView: 0x76b93e0; frame = (0 0; 320 416); autoresize = W+H; layer = <CALayer: 0x7386850>> 
    | | <UINavigationBar: 0x73664b0; frame = (0 20; 320 44); clipsToBounds = YES; opaque = NO; autoresize = W; layer = <CALayer: 0x7366550>> 
    | | | <UINavigationBarBackground: 0x7360ea0; frame = (0 0; 320 44); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7366520>> - (null) 
    | | | <UINavigationItemView: 0x76b95e0; frame = (160 21; 0 0); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x76aa8e0>> 
    | | | <UINavigationItemButtonView: 0x7550650; frame = (5 7; 73 30); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7368b40>> 
Current language: auto; currently objective-c 
(gdb) 
+0

No estoy familiarizado con el mensaje 'viewDidBecomeActive', y cuando busqué' developer.apple.com' para ella, tengo a ningún resultado. Tal vez deberías decirnos más sobre este método, o incluso mostrarnos tu código. –

+0

Lo siento, quise decir applicationDidBecomeActive. Editaré la publicación. –

+0

Estoy tratando de replicar su vista modal apareciendo, pero me está diciendo pushViewController: no se reconoce animado, ¿me puede decir si lo intentó en iOS 6? – perrohunter

Respuesta

4

le sugiero que utilice applicationWillEnterForeground:, no applicationDidBecomeActive:, ya que funciona mejor con gestos multitarea. Por ejemplo, no desea colocar la pantalla de bloqueo si el usuario hace doble clic en el botón de inicio para mostrar la barra de tareas, y luego descarta la barra de tareas sin cambiar las aplicaciones.

Es de suponer que su AppDelegate tiene una propiedad window, y ustedes saben que controlador de vista raíz de su ventana es una UINavigationController.

- (void)applicationWillEnterForeground:(UIApplication *)application { 
    PasscodeViewController *pvc = [[PasscodeViewController alloc] init]; 
    [(UINavigationController *)self.window.rootViewController pushViewController:pvc animated:NO]; 
    // [pvc release]; if not using ARC 
} 
+0

Implementé ese código sin advertencias ni errores, pero en lugar de mostrar toda la vista, solo muestra la barra de navegación con una pantalla negra debajo. ¿Algunas ideas? No tengo que declarar la vista en el encabezado ni nada de lo que hacer? Gracias de nuevo. –

+0

Pausa en el depurador y haz 'po [[(id) UIApp keyWindow] recursiveDescription]'. –

+0

De acuerdo, recuperé la información sobre la jerarquía de vistas, pero no estoy muy seguro de cómo analizarla/usarla.Alguien más en SO tuvo el mismo problema con la pantalla en negro, y la solución fue eliminar la implementación de loadView, que de todos modos no tengo. –

0

Resuelto

PasscodeViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"passcodeVCID"]; 
UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:vc]; 
navController.navigationBar.hidden = YES; 
vc.mode = @"enable"; 
self.window.rootViewController = navController; 

Uso en applicationWillEnterForeground método.

0

versión de Swift rápida y de forma generalizada:

getRootViewController().presentViewController(messageVC, animated: true, completion: nil) 

func getRootViewController() -> UIViewController 
{ 
    return (UIApplication.sharedApplication().delegate?.window??.rootViewController)! 
} 
Cuestiones relacionadas