Présent UIAlertController D'AppDelegate [dupliquer]

cette question a déjà une réponse ici:

j'essaie de présenter un UIAlertController de L'AppDelegate dans mon application iOS. Ci-dessous, 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, quand j'essaie de présenter l'alerte, elle n'apparaît pas et je reçois l'alerte suivante dans la console.

Warning: Attempt to present <UIAlertController: 0x145f5d60> on <UINavigationController: 0x146590f0> whose view is not in the window hierarchy!

Qu'est-ce qui cause l'erreur et comment la corriger?

34
demandé sur Satre 2014-11-16 02:37:39

7 réponses

vous pouvez également utiliser ce code si vous souhaitez le lancer à partir de didFinishLaunchingWithOptions.Espérons que cette aide.

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
répondu Aditya Gaonkar 2015-07-23 14:15:34

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]; 
}
18
répondu Sreekanth 2016-03-03 07:13:55

Il est préférable d'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à le contrôleur de vue modale.

12
répondu Mikhail Mkl 2015-10-18 10:08:45

vous l'appelez avant que la fenêtre ne s'ouvre et que le contrôleur de navigation ne s'affiche:

"attention: la Tentative de présenter sur dont la vue n'est pas dans la fenêtre hiérarchie!"

est-il probable que vous le fassiez dans l'application did finishlaunching?


soit attendre .. comme le faire quand la vue apparaît vraiment

ou

un "hack" serait de forcer l'affichage et fenêtre vous-même:

[self.window addSubview:self.rootViewController.view];
[self.window makeKeyAndVisible];
5
répondu Daij-Djan 2014-11-16 00:48:35

j'ai essayé la même chose mais ne fonctionne pas parce qu'après changement de viewcontroller retourné encore le viewcontroller initial et jeter l'erreur whose view is not in the window hierarchy! . Finalement, 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
répondu Kevin 2016-05-28 02:08:31

vous pouvez essayer de l'appeler dans viewDidAppear au lieu de viewDidLoad . J'ai eu une erreur similaire et qu'il fixe.

1
répondu kakubei 2015-04-21 11:43:47

Utilisant Le Contrôleur D'Alerte:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
dispatch_async(dispatch_get_main_queue(), {

    //INTERNET NOT AVAILABLE ALERT
    var internetUnavailableAlertController = UIAlertController (title: "Network Unavailable", message: "Please check your internet connection settings and turn on Network Connection", preferredStyle: .Alert)

    var settingsAction = UIAlertAction(title: "Settings", style: .Default) { (_) -> Void in
        let settingsUrl = NSURL(string: UIApplicationOpenSettingsURLString)
        if let url = settingsUrl {
            UIApplication.sharedApplication().openURL(url)
        }
    }
    var cancelAction = UIAlertAction(title: "Okay", style: .Default, handler: nil)
    internetUnavailableAlertController .addAction(settingsAction)
    internetUnavailableAlertController .addAction(cancelAction)
    self.window?.rootViewController!.presentViewController(internetUnavailableAlertController , animated: true, completion: nil)
    })

Utilisant AlertView:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    dispatch_async(dispatch_get_main_queue(), {

        //INTERNET NOT AVAILABLE ALERTVIEW

        let internetUnavailableAlert =  UIAlertView(title: "Network Unavailable", message: "Please check your internet connection settings and turn on Network Connection", delegate: self, cancelButtonTitle: "Okay")
        internetUnavailableAlert.show()
        })

  return true
 }
}
-1
répondu A.G 2016-04-27 07:38:28