web-dev-qa-db-fra.com

Présent UIAlertController d'AppDelegate

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?

34
Satre

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)
        })
28
Aditya Gaonkar

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]; 
}
19
Sreekanth

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.

13
Mikhail Mkl

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];
5
Daij-Djan

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()
}
2
Kevin

Vous pouvez essayer de l'appeler dans viewDidAppear au lieu de viewDidLoad. J'ai eu une erreur similaire et cela l'a corrigée.

1
kakubei