2012-07-31 10 views
6

voglio presentare un modalviewcontroller dopo ogni push-messaggio dei recieves app in "applicazione: (UIApplication *) applicazione didReceiveRemoteNotification: (NSDictionary *) userInfo"presente più di un modalview in AppDelegate

presento la viewcontroller come questo:

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

Così, quando un altro push-messaggio arriva e il vecchio modalViewController è ancora visibile, voglio presentare un nuovo modalviewcontroller sul vecchio. Ma non funziona. Non è successo niente e la console dice solo (penso che sia un debug-messaggio di iOS 6 Beta):

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

Che cosa sto facendo di sbagliato?

PS: Non voglio ignorare il vecchio ViewController, voglio che si impilino.

Grazie!

risposta

11

È possibile ottenere cima ai vostri controller di vista, poi presentare un nuovo modale dal quel controllore vista dall'alto

- (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]; 
} 

È possibile chiamare questo metodo con RootViewController è RootViewController della finestra

+0

funziona perfettamente! molte grazie! :) – CrEaK

+0

Ottima soluzione, grazie. – NSTJ

0

Qui è la stessa di cui sopra , ma scritto in 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 era vicino, ma ha avuto un paio di errori che causano a restituire il controller di vista sbagliato in qualche casi. Ecco una versione corretta.

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 
}