[ios] Tentativo di presentare UIViewController su UIViewController la cui vista non è nella gerarchia delle finestre



10 Answers

Un'altra potenziale causa:

Ho riscontrato questo problema quando per sbaglio ho presentato due volte lo stesso controller di visualizzazione. (Una volta con performSegueWithIdentifer:sender: che è stato chiamato quando il pulsante è stato premuto, e una seconda volta con un seguito collegato direttamente al pulsante).

In effetti, due sequenze sparavano contemporaneamente, e ho ricevuto l'errore: Attempt to present X on Y whose view is not in the window hierarchy!

Question

Ho appena iniziato ad usare Xcode 4.5 e ho ricevuto questo errore nella console:

Avvertenza: tentare di presentare <finishViewController: 0x1e56e0a0> su <ViewController: 0x1ec3e000> la cui vista non è nella gerarchia della finestra!

La vista è ancora in fase di presentazione e tutto nell'app funziona perfettamente. È qualcosa di nuovo in iOS 6?

Questo è il codice che sto usando per cambiare tra le visualizzazioni:

UIStoryboard *storyboard = self.storyboard;
finishViewController *finished = 
[storyboard instantiateViewControllerWithIdentifier:@"finishViewController"];

[self presentViewController:finished animated:NO completion:NULL];



Ho avuto lo stesso problema. Ho dovuto incorporare un controller di navigazione e presentare il controller attraverso di esso. Di seguito è riportato il codice di esempio.

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIImagePickerController *cameraView = [[UIImagePickerController alloc]init];
    [cameraView setSourceType:UIImagePickerControllerSourceTypeCamera];
    [cameraView setShowsCameraControls:NO];

    UIView *cameraOverlay = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 768, 1024)];
    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"someImage"]];
    [imageView setFrame:CGRectMake(0, 0, 768, 1024)];
    [cameraOverlay addSubview:imageView];

    [cameraView setCameraOverlayView:imageView];

    [self.navigationController presentViewController:cameraView animated:NO completion:nil];
//    [self presentViewController:cameraView animated:NO completion:nil]; //this will cause view is not in the window hierarchy error

}



Ho anche riscontrato questo problema quando ho provato a presentare un controller di visualizzazione in viewDidLoad . Ho provato la risposta di James Bedford. Funziona ma la mia app mostrerà lo sfondo prima per 1 o 2 secondi.

Dopo la ricerca, finalmente ho trovato un altro modo per risolvere questo problema. Usa controller vista figlio.

- (void)viewDidLoad
{
    ...
    [self.view addSubview:navigationViewController.view];
    [self addChildViewController:navigationViewController];
    ...
}



Ho appena avuto questo problema, ma non aveva niente a che fare con i tempi. Stavo usando un singleton per gestire le scene e l'ho impostato come presentatore. In altre parole, il "Sé" non era collegato a nulla. Ho appena fatto la sua "scena" interiore il nuovo presentatore e voilà, ha funzionato. (Voila perde il suo tocco dopo aver appreso il suo significato, heh).

Quindi sì, non si tratta di "trovare magicamente la strada giusta", si tratta di capire dove si trova il tuo codice e cosa sta facendo. Sono felice che Apple abbia dato un messaggio di avvertimento semplice in inglese, anche con emozione. Complimenti al dev della mela che l'ha fatto !!




Ho avuto lo stesso problema. Il problema era, performSegueWithIdentifier è stato attivato da una notifica, non appena ho messo la notifica sul thread principale il messaggio di avviso era sparito.




Ho riscontrato questo problema e la causa principale era la sottoscrizione a un gestore di clic del pulsante (TouchUpInside) più volte.

Si stava iscrivendo a ViewWillAppear, che veniva chiamato più volte da quando avevamo aggiunto la navigazione per passare a un altro controller, e poi tornarci.




Probabilmente, come me, hai una vista di root viewController

Voglio visualizzare un ViewController in un contesto non-UIViewController ,

Quindi non posso usare questo codice:

[self presentViewController:]

Quindi, ottengo un UIViewController:

[[[[UIApplication sharedApplication] delegate] window] rootViewController]

Per qualche ragione (bug logico), rootViewController è qualcosa di diverso dal previsto (un normale UIViewController ). Quindi correggo il bug, sostituendo rootViewController con un UINavigationController , e il problema è scomparso.




Devo scrivere sotto la linea.

self.searchController.definesPresentationContext = true

invece di

self.definesPresentationContext = true

in UIViewController




Nel caso in cui aiuti qualcuno, il mio problema è stato estremamente sciocco. Totalmente colpa mia, naturalmente. Una notifica stava attivando un metodo che stava chiamando il modal. Ma non stavo rimuovendo la notifica correttamente, quindi ad un certo punto avrei avuto più di una notifica, quindi il modale sarebbe stato chiamato più volte. Ovviamente, dopo aver chiamato la modale una volta, il viewcontroller che la chiama non è più nella gerarchia della vista, ecco perché vediamo questo problema. La mia situazione ha causato anche una serie di altri problemi, come ci si aspetterebbe.

Quindi, per riassumere, qualunque cosa tu stia facendo assicurati che la modale non venga chiamata più di una volta .




Mi è successo che il seguito nello storyboard fosse una specie di rottura . Eliminando il seguito (e creando di nuovo lo stesso seguito) risolto il problema.




Se hai un oggetto AVPlayer con un video riprodotto, devi prima mettere in pausa il video.




Related