2012-07-31 10 views
6

Ich möchte ein modalviewcontroller nach jeder Push-Nachricht, die die App BEKOMMT in präsentieren "Anwendung: (UIApplication *) Anwendung didReceiveRemoteNotification: (NSDictionary *) userinfo"vorhanden mehr als ein modalview in AppDelegate

stelle ich die Viewcontroller wie dies:

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

Also, wenn ein andere Push-Nachricht eintrifft und die alten ModalViewController noch visibile, ich mag einen neuen modalviewcontroller über die alten präsentieren. Aber es funktioniert nicht. Es ist nichts passiert und die Konsole nur sagt (ich glaube, es ist eine Debug-Nachricht von iOS 6 Beta):

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

Was mache ich falsch?

PS: Ich möchte nicht den alten ViewController entlassen, ich möchte sie stacken.

Danke!

Antwort

11

Sie können oben auf Ihrer Ansicht-Controller erhalten, stellen Sie dann eine neue modale von diesem Top-View-Controller

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

Sie können mit RootViewController diese Methode aufrufen, ist RootViewController Fenster

+0

funktioniert perfekt! Danke vielmals! :) – CrEaK

+0

Tolle Lösung, danke. – NSTJ

0

ist hier die gleiche wie oben aber geschrieben, 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

Voll Decent war in der Nähe, aber sie hatte ein paar Fehler, die Sie verursachen die falschen Ansicht-Controller in einigen zurückzukehren Fälle. Hier ist eine korrigierte Version.

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 
}