2012-11-16 11 views
7

Sto utilizzando lo storyboard e voglio aprire sempre la stessa vista quando l'utente riceve le notifiche push remote, anche l'app è in background o aperta. La vista che devo presentare è quattro viste dopo il controller della vista iniziale impostato nello storyboard. Ho letto questo post:Apri controller di visualizzazione durante la ricezione di notifiche push remote

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

Così qui è il mio codice:

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


} 

Ma quando ricevo la notifica, l'applicazione si blocca con questo errore:

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

locationViewController è il punto di vista Ller impostato come iniziale nello storyboard.

Molte grazie.

+1

Supponiamo, "HomeViewController" è il controller della vista iniziale Storyboard, e dopo aver fatto clic su un pulsante, ora sei in "SecondViewController" con il metodo push. Ora ricevi la notifica Push. Vuoi premere "NotificationViewController" o presentarlo modalmente? –

+0

Modalmente, quindi non sono sicuro di capire la tua spiegazione, suggerisci di spingere lo stack fino a quando non ottengo notificacionViewController? Grazie – theomen

risposta

19

Si prega di provare il seguente codice:

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

Molte grazie. Mi dà questo errore: Nessuna interfaccia @ visibile per 'UINavigationController' dichiara il selettore 'pushViewController:' per la riga [navController.visibleViewController.navigationController pushViewController: notificationViewController]; – theomen

+2

Si prega di provare questo. [navController.visibleViewController.navigationController pushViewController: notificationViewController animato: YES]; –

2

Il mio codice si differenzia un po 'dalle risposte che ho visto. Il fatto è che l'unico codice che funziona mi forma, è la seguente:

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. Solitamente il rootviewcontroller nella maggior parte dei casi, ma non in tutto

2.- Istanziare lo storyboard. Usuarlly contrassegnato come MainStoryboard

3.- Istanziare il controller di visualizzazione specifico. È necessario adattare per il vostro caso particolare

4.- spinta come si dovrebbe fare perché hai impostato tutto ciò che serve

+1

Come lo farebbe nel caso in cui l'app sia attiva e in esecuzione e l'utente si trovi in ​​profondità nell'app? – Andy

Problemi correlati