2012-11-16 2 views
7

Ich verwende Storyboard, und ich möchte immer die gleiche Ansicht öffnen, wenn der Benutzer Remote-Push-Benachrichtigungen erhält, auch die App ist im Hintergrund oder geöffnet. Die Ansicht, die ich präsentieren muss, ist vier Ansichten nach dem ersten View-Controller, der im Storyboard festgelegt wurde. Ich lese diese Beiträge:Open-View-Controller beim Empfang von Remote-Push-Benachrichtigung

How can I show a modal view in response to a notification as a new window? (no parent vc)

Open a specific tab/view when user receives a push notification

So, hier ist mein Code:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 

    UINavigationController *navController = (UINavigationController *)self.window.rootViewController; 
    notificacionViewController *menu = [navController.storyboard instantiateViewControllerWithIdentifier:@"notificacion"]; 

    // First item in array is bottom of stack, last item is top. 
    navController.viewControllers = [NSArray arrayWithObjects:menu,nil]; 

    [self.window makeKeyAndVisible]; 


} 

Aber wenn ich eine Benachrichtigung erhalten, die App stürzt mit diesem Fehler:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[locationViewController setViewControllers:]: unrecognized selector sent to instance 0x42ccd0' 

locationViewController ist die Ansichtssteuerung Als Initial im Storyboard eingestellt.

Vielen Dank.

+1

Angenommen, „HomeViewController“ ist der erste View-Controller in der Storyboard, und nach dem Klicken auf eine Schaltfläche, jetzt Sie sind in "SecondViewController" per Push-Methode. Jetzt erhalten Sie eine Push-Benachrichtigung. Möchten Sie "NotificationViewController" drücken oder modal präsentieren? –

+0

Modally, so bin ich mir nicht sicher, deine Erklärung zu verstehen, schlägst du vor, den Stapel zu schieben, bis ich notificacionViewController bekomme? Danke – theomen

Antwort

19

Bitte versuchen Sie den folgenden Code:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    UINavigationController *navController = (UINavigationController *)self.window.rootViewController; 
    NotificationViewController *notificationViewController = [[NotificationViewController alloc] init]; 
    [navController.visibleViewController.navigationController pushViewController:notificationViewController];  
} 
+0

Vielen Dank. Es gibt mir diesen Fehler: Keine sichtbare @ Schnittstelle für 'UINavigationController' deklariert den Selektor 'pushViewController:' für die Zeile [navController.visibleViewController.navigationController pushViewController: notificationViewController]; – theomen

+2

Bitte versuchen Sie es. [navController.visibleViewController.navigationController pushViewController: notificationViewController animiert: YES]; –

2

Mein Code unterscheidet sich ein wenig von den Antworten, die ich gesehen habe. Tatsache ist, dass der einzige Code, der mir funktioniert, der folgende ist:

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; 

    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil]; 

    IniciarSliderViewController *controller = (IniciarSliderViewController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"MenuSlider"]; 

    [navigationController pushViewController:controller animated:YES]; 

1.- Instantiate de navigationController. Normalerweise ist der rootviewcontroller in der überwiegenden Mehrheit der Fälle, aber nicht in allen

2.- Instantiate das Storyboard. Usuarlly getaggt als MainStoryboard

3. Instantiieren Sie Ihren spezifischen Ansichtscontroller. Sie müssen

4.- Drücken für Ihren speziellen Fall anzupassen, wie Sie tun sollen, weil Sie festgelegt haben alles, was Sie brauchen

+1

Wie würden Sie das tun, wenn die App läuft und der Benutzer tief in der App ist? – Andy