J'essaie de présenter un UIAlertController
de l'AppDelegate dans mon application iOS. Voici l'alerte et la méthode actuelle.
UIAlertController *alert = [UIAlertController alertControllerWithTitle:cTitle message:cMessage preferredStyle:UIAlertControllerStyleAlert];
//Configure alert and actions
[self.window.rootViewController presentViewController:alert animated:TRUE completion:nil];
Cependant, lorsque j'essaie de présenter l'alerte, elle n'apparaît pas et j'obtiens l'alerte suivante dans la console.
Warning: Attempt to present <UIAlertController: 0x145f5d60> on <UINavigationController: 0x146590f0> whose view is not in the window hierarchy!
Quelle est la cause de l'erreur et comment la corriger?
Vous pouvez également utiliser ce code si vous souhaitez le lancer à partir de didFinishLaunchingWithOptions. J'espère que cela vous aidera.
dispatch_async(dispatch_get_main_queue(), {
let importantAlert: UIAlertController = UIAlertController(title: "Action Sheet", message: "Hello I was presented from appdelegate ;)", preferredStyle: .ActionSheet)
self.window?.rootViewController?.presentViewController(importantAlert, animated: true, completion: nil)
})
essayez ce code ..
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
NSLog(@"rakshapettu");
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"AlertView" message:@"I am an AlertView" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
[alert dismissViewControllerAnimated:YES completion:nil];
}];
[alert addAction:defaultAction];
UIWindow *alertWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
alertWindow.rootViewController = [[UIViewController alloc] init];
alertWindow.windowLevel = UIWindowLevelAlert + 1;
[alertWindow makeKeyAndVisible];
[alertWindow.rootViewController presentViewController:alert animated:YES completion:nil];
}
Il vaut mieux utiliser quelque chose comme:
var hostVC = self.window?.rootViewController
while let next = hostVC?.presentedViewController {
hostVC = next
}
hostVC?.presentViewController(alertController, animated: true, completion: nil)
Les réponses précédentes ne fonctionneront pas si vous présentez déjà un contrôleur de vue modale.
vous l'appelez avant que la fenêtre ne soit ouverte et que le navigationController soit réellement affiché:
"Attention: Tentative de présentation sur la vue de laquelle la vue n'est pas dans la hiérarchie des fenêtres!"
vous le ferez probablement dans applicationDidFinishLaunching?
Soit attendre .. comme le faire quand la vue apparaît vraiment
OR
un "hack" serait de forcer la vue et la fenêtre vous-même:
[self.window addSubview:self.rootViewController.view];
[self.window makeKeyAndVisible];
J'essayais la même chose mais ne fonctionne pas car après le changement de viewcontroller, j'ai toujours renvoyé le viewcontroller initial et jeté l'erreur whose view is not in the window hierarchy!
. Enfin, j'ai trouvé la solution à ce problème:
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)
Mais je dois forcer les contrôleurs de vue à mettre à jour de keyWindow
avec ceci:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
UIApplication.sharedApplication().keyWindow!.rootViewController = self
UIApplication.sharedApplication().keyWindow!.makeKeyAndVisible()
}
Vous pouvez essayer de l'appeler dans viewDidAppear
au lieu de viewDidLoad
. J'ai eu une erreur similaire et cela l'a corrigée.