web-dev-qa-db-fra.com

Attention: essayez de présenter ViewController dont la vue ne se trouve pas dans la hiérarchie des fenêtres.

Dans l'une de mes applications, j'appelle un viewController à partir de la méthode application didReceiveLocalNotification. La page a été chargée avec succès, mais un avertissement s'affiche:

 Warning: Attempt to present <blankPageViewController: 0x1fda5190> on 
 <ViewController: 0x1fd85330> whose view is not in the window hierarchy!

Mon code est le suivant:

 -(void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {

    blankPageViewController *myView = [[blankPageViewController alloc] 
               initWithNibName:@"blankPageViewController" bundle: nil];
    myView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self.viewController presentViewController:myView animated:NO completion:nil];  
}
31
Vinoy Alexander

Enfin, j'ai résolu ce problème avec le code suivant.

-(void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
       self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
       self.blankviewController = [[blankPageViewController alloc] initWithNibName:@"blankPageViewController" bundle:nil];
       self.window.rootViewController = self.blankviewController;
       [self.window makeKeyAndVisible];
}
21
Vinoy Alexander

Mettre

[self.viewController presentViewController:myView animated:NO completion:nil];  

dans une fonction, par exemple.

- (void)yourNewFunction
{
    [self.viewController presentViewController:myView animated:NO completion:nil];
}

puis appelez ça comme ça:

[self performSelector:@selector(yourNewFunction) withObject:nil afterDelay:0.0];

Le problème a été décrit ici et pourquoi ce performSelector:withObject:afterDelay corrige-t-il ce problème? Parce que le sélecteur ne sera pas appelé avant la prochaine exécution de la boucle d'exécution. Donc, les choses ont le temps de se calmer et vous éviterez une boucle.

15
hashier

Selon mon hypothèse, j'ai l'impression que vous essayez de présenter myView à partir de self.viewController avant que self.viewController soit attaché ou placé dans la hiérarchie des fenêtres. Assurez-vous simplement de présenter myView après que self.viewController soit affiché/attaché à la fenêtre.

Pourquoi un contrôleur de vue modale ne peut-il pas en présenter un autre dans viewDidLoad?

12
βhargavḯ

J'avais un problème similaire, j'appelais le présentViewController depuis mon AppDelegate.m lorsque l'application est entrée au premier plan:

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    NSDate * lastActive = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastActive"];

    double interval = [[NSDate date] timeIntervalSinceDate:lastActive];

    NSLog(@"Time Interval: %f", interval);

    if (interval > 900) { // interval is in seconds, so 900 seconds = 15 mins
        Login *pres = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:@"login"];

        UINavigationController *navi = ((UINavigationController*)self.window.rootViewController);
        if (navi.presentedViewController) {
            [navi dismissViewControllerAnimated:YES completion:^{
                [navi presentViewController:pres animated:NO completion:nil];
            }];
        } else {
            [navi presentViewController:pres animated:NO completion:nil];
        }
    }
}

Cela n'a pas posé de problème, car le contrôleur de vue est d'abord ignoré (quel que soit le type de vues auquel il a été appliqué) s'il était présent avant la présentation du contrôleur de vue de connexion. Sinon, je peux simplement présenter immédiatement le contrôleur de vue de connexion.

2
Rob

il se peut que la vue du contrôleur de la vue ne soit pas actuellement chargée dans la hiérarchie des fenêtres lorsque VC est présenté ...

-(void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController;
    rootViewController = [[navigationController viewControllers] objectAtIndex:0];
    blankPageViewController *myView = [[blankPageViewController alloc] initWithNibName:@"blankPageViewController" bundle: nil];
    [rootViewController presentModalViewController:myView animated:YES];
}
2
BhushanVU

Cas de bord:

Certaines personnes trouveront peut-être cela par le biais de Google et il convient de souligner que cette erreur est parfois générée si vous chargez une vue vers le haut en tant que contrôleur de vue racine qui n'est pas étiqueté comme la vue initiale dans Storyboard (et une autre charger une autre vue sur le dessus. Par exemple, dans les vues de connexion qui sont chargées par programme à partir de la méthode applicationdidfinish... du délégué d'application. Modifiez simplement la vue initiale (faites glisser la flèche dans le scénarimage) sur celle qui convient pour votre hiérarchie. Esotérique, vague, mais mérite d'être souligné. 

1
LpLrich
I have used Navigation Controller and on which i have used a
ModalViewController to present a Popup(Present over current context). 
From this Popup i am opening a ViewController Modally which 
caused the Warning. So to resolve i did below change:

[self.presentedViewController performSegueWithIdentifier:@"PresentScreenSegueId" sender:sender];
0
Suraj Mirajkar

Si votre type d'application est UINavigationController, vous pouvez l'utiliser.

-(void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {

blankPageViewController *myView = [[blankPageViewController alloc]
                                   initWithNibName:@"blankPageViewController" bundle: nil];
myView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self.navigationController presentViewController:myView animated:NO completion:nil]; }

J'espère que cela vous aidera . Tous les meilleurs !!!

0
Yashesh

PourSwift 2.0j'ai utilisé une substitution pour viewDidAppear avec:

laisser vc = self.storyboard? .instantiateViewControllerWithIdentifier ("Second") comme! SecondViewController

self.presentViewController(vc, animated: true, completion: nil)

Où "Second" est l'ID de storyboard du SecondViewController dans l'inspecteur d'identité.

0
Sarah Prata