662 votes

dont la vue n’est pas dans la hiérarchie de la fenêtre

Juste commencé à utiliser Xcode 4.5 et j'ai eu cette erreur dans la console:

Warning: Attempt to present <finishViewController: 0x1e56e0a0> on <ViewController: 0x1ec3e000> whose view is not in the window hierarchy!

La vue est encore présentées et tout dans l'app fonctionne bien. Est-ce quelque chose de nouveau dans iOS 6?

C'est le code que j'utilise pour changer entre les points de vue:

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

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

1404voto

James Bedford Points 10691

Où en êtes-vous de l'appel de cette méthode? J'ai eu un problème lorsque je tente de présenter un modal-vue-contrôleur au sein de l' viewDidLoad méthode. La solution pour moi a été de passer cet appel à l' viewDidAppear: méthode.

Ma présomption est que le point de vue du contrôleur de la vue n'est pas dans la fenêtre d'affichage de la hiérarchie, au point qu'il a été chargé (lorsque l' viewDidLoad message est envoyé), mais il est dans la fenêtre hiérarchie après qu'il a été présenté (lorsque l' viewDidAppear: message est envoyé).


Avertissement

Si vous faites un appel à l' presentViewController:animated:completion: dans la viewDidAppear: vous risquez de rencontrer un problème selon lequel le modal-vue-contrôleur est toujours présenté à chaque fois que le point de vue du contrôleur de la vue s'affiche (ce qui est logique!) et donc le modèle-vue-contrôleur en cours de sera présenté de ne jamais s'en aller...

Peut-être que ce n'est pas le meilleur endroit pour présenter le modèle-vue-contrôleur, ou peut-être supplémentaire de l'état doit être conservé qui permet de présenter en vue de contrôleur de décider s'il doit ou non présenter un modal-vue-contrôleur immédiatement.

39voto

Jonny Points 2898

viewWillLayoutSubviews et viewDidLayoutSubviews (iOS 5.0+) peut être utilisé à cette fin. Ils sont appelés plus tôt que viewDidAppear.

19voto

sunkehappy Points 4423

J'ai aussi rencontré ce problème quand j'ai essayé de présenter une vue contrôleur en viewDidLoad. J'ai essayé de James Bedford réponse. Il fonctionne, mais mon application va vous montrer le fond tout d'abord, pour 1 ou 2 secondes.

Après recherche j'ai enfin trouver une autre façon de résoudre ce problème est l'utilisation de l'enfant-vue-contrôleur.

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

15voto

iCoke Points 88

Sans doute, comme moi, vous avez une fausse racine viewController

Je veux afficher un ViewController en non-UIViewController contexte,

Je ne peux donc pas utiliser ce code:

[self presentViewController:]

Donc, je reçois un UIViewController:

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

Pour une raison quelconque (logique bug), l' rootViewController est autre chose que prévu ( UIViewController). Puis-je corriger le bug, en remplaçant rootViewController avec un UINavigationController, et le problème a disparu.

3voto

resting Points 879

J'ai eu le même problème. J'ai dû intégrer une manette de navigation et de présenter le contrôleur à travers elle. Ci-dessous est un exemple de code.

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

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X