2012-03-07 1 views
9

utilizzando il seguente codice nel genitore ViewController, voglio presentare una seconda vista ontop del primo, quindi respingere il primo:Come presentare una seconda ViewController & respingere il primo

// Animates the next questionViewController using the first questionViewController 
[previousView presentViewController:nextQuestionViewController animated:YES completion:nil]; 

// Dismiss the first questionViewController 
[previousView dismissViewControllerAnimated:NO completion:nil]; 

Quando run, il viene presentata la seconda vista, ma la prima visione non verrà ignorata.

+0

previousView è un viewController su una pila controller di navigazione o è stato visualizzato modale? –

+0

Sì, viene visualizzato in modo modale. Non riesco a capire perché non verrà respinto. –

+0

Dal tuo codice, dice solo presentViewController: animato, non presenteModalViewController: animato –

risposta

12

Si avrebbe bisogno di respingere prima il "previousView" & poi presentare il "nextQuestionViewController":

// Dismiss the first questionViewController 
[previousView dismissViewControllerAnimated:NO completion:nil]; 

// Animates the next questionViewController using the first questionViewController 
[previousView presentViewController:nextQuestionViewController animated:YES completion:nil]; 
+1

In seguito a questa risposta, si verifica la seguente eccezione: 'Terminazione dell'app a causa dell'eccezione non rilevata 'NSInvalidArgumentException', motivo: 'L'applicazione ha tentato di presentare modally un controller attivo .'' – Benjamin

+0

Non pensi che sarà un errore incline a usare un controller di visualizzazione per presentarne un altro, sapendo che esso stesso verrà deallocato in un determinato momento. Preferirei usare '[[UIApplication sharedApplication] .keyWindow.rootViewController' o simile a' nextQuestionViewController', come suggerito da @Mozilla. – atulkhatri

4

provare

[self dismissViewControllerAnimated:NO completion:nil]; 

in difetto:

[self.navigationController popViewControllerAnimated:YES]; 
+0

Sto tentando di risolvere di nuovo questo problema - l'uso di entrambi questi metodi non riesce a eliminare il secondo viewController, dopo aver presentato il primo - mi manca qualcos'altro? –

+0

Come dice Raphael, dovresti presentare il secondo viewController come segue: [previousView presentModalViewController: nextQuestionViewController animated: YES]; – ader

2

ho fatto successivo (auto - è il tuo vecchio controller):

UIStoryboard *storyboard = self.storyboard; 

[self dismissViewControllerAnimated:YES 
         completion:^{ 
     UIViewController *newController = [storyboard instantiateViewControllerWithIdentifier:@"newControllerStoryboardId"]; 
     newController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 

     [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:newController animated:YES completion:nil]; 
    }]; 
-1

Sembra che non sia possibile passare da B a C senza mostrare A brevemente, che sembra poco professionale. Tuttavia, si può mettere una visualizzazione secondaria nero sopra la parte superiore di A fino a quando hai animato di C.

Per il codice, vedi la mia risposta a https://stackoverflow.com/a/45579371/218226