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];
}
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];
}
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.
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?
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.
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];
}
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é.
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];
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 !!!
PourSwift 2.0
j'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é.