2012-07-31 19 views
6

Quiero presentar un modalviewcontroller después de cada-mensaje push los recieves App en "aplicación: (UIApplication *) aplicación didReceiveRemoteNotification: (NSDictionary *) userInfo"presente más de un modalview en AppDelegate

presento los viewcontroller como esto:

ReleaseViewController *viewController = [[ReleaseViewController alloc] init]; 
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 
[self.window.rootViewController presentModalViewController:navController animated:YES]; 

Así que cuando otro mensaje push-llega y el viejo modalViewController sigue siendo visibile, quiero presentar un nuevo modalviewcontroller sobre la vieja. Pero no funciona. No pasó nada y la consola se limita a decir (creo que es un mensaje de depuración de iOS 6 Beta):

Warning: Attempt to present <UINavigationController: 0x1dde6c30> on <UINavigationController: 0x1dd73c00> whose view is not in the window hierarchy! 

¿Qué estoy haciendo mal?

PD: No quiero descartar el viejo ViewController, quiero que se apilen.

Gracias!

Respuesta

11

Usted puede obtener la parte superior de sus controladores de vista, a continuación, presentar un nuevo modal a partir de ese controlador de vista superior

- (UIViewController *)topViewController:(UIViewController *)rootViewController 
{ 
    if (rootViewController.presentedViewController == nil) { 
     return rootViewController; 
    } 

    if ([rootViewController.presentedViewController isMemberOfClass:[UINavigationController class]]) { 
     UINavigationController *navigationController = (UINavigationController *)rootViewController.presentedViewController; 
     UIViewController *lastViewController = [[navigationController viewControllers] lastObject]; 
     return [self topViewController:lastViewController]; 
    } 

    UIViewController *presentedViewController = (UIViewController *)rootViewController.presentedViewController; 
    return [self topViewController:presentedViewController]; 
} 

Usted puede llamar a este método con RootViewController es RootViewController de ventana

+0

funciona perfecto! ¡muchas gracias! :) – CrEaK

+0

Gran solución, gracias. – NSTJ

0

aquí es el mismo que el anterior , pero escrito en Swift

private func topViewController() -> UIViewController { 
    var rootViewController = UIApplication.sharedApplication().keyWindow!.rootViewController! 
    repeat { 
     if rootViewController.presentingViewController == nil { 
      return rootViewController 
     } 
     if let navigationController = rootViewController.presentedViewController as? UINavigationController { 
      rootViewController = navigationController.viewControllers.last! 
     } 
     rootViewController = rootViewController.presentedViewController! 
    } while true 
} 
0

completa decente estaba cerca, pero tuvo algunos errores que hacen que usted devuelva el controlador de vista equivocado en alguna casos. Aquí hay una versión corregida.

private func topViewController(rootViewController: UIViewController) -> UIViewController { 
    var rootViewController = UIApplication.sharedApplication().keyWindow!.rootViewController! 
    repeat { 
     guard let presentedViewController = rootViewController.presentedViewController else { 
      return rootViewController 
     } 

     if let navigationController = rootViewController.presentedViewController as? UINavigationController { 
      rootViewController = navigationController.topViewController ?? navigationController 

     } else { 
      rootViewController = presentedViewController 
     } 
    } while true 
} 
Cuestiones relacionadas