ios objective-c appdelegate uialertcontroller

ios - Presente UIAlertController desde AppDelegate



objective-c (7)

Esta pregunta ya tiene una respuesta aquí:

Estoy tratando de presentar un UIAlertController desde AppDelegate en mi aplicación iOS. A continuación se muestra la alerta y el presente método.

UIAlertController *alert = [UIAlertController alertControllerWithTitle:cTitle message:cMessage preferredStyle:UIAlertControllerStyleAlert]; //Configure alert and actions [self.window.rootViewController presentViewController:alert animated:TRUE completion:nil];

Sin embargo, cuando intento presentar la alerta, no aparece y aparece la siguiente alerta en la consola.

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

¿Qué está causando el error y cómo lo soluciono?


Es mejor usar algo como:

var hostVC = self.window?.rootViewController while let next = hostVC?.presentedViewController { hostVC = next } hostVC?.presentViewController(alertController, animated: true, completion: nil)

Las respuestas anteriores no funcionarán si ya está presentando el controlador de vista modal.


Estaba intentando lo mismo, pero no funciona porque después del cambio de viewcontroller todavía devolvió el controlador de vista inicial y arrojó el error whose view is not in the window hierarchy! . Finalmente, encontré la solución a este problema:

UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)

Pero tengo que forzar a los controladores de vista a actualizar de keyWindow con esto:

override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) UIApplication.sharedApplication().keyWindow!.rootViewController = self UIApplication.sharedApplication().keyWindow!.makeKeyAndVisible() }


Puede usar este código también si desea iniciarlo desde didFinishLaunchingWithOptions. Hope esto ayuda.

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) })


Puedes intentar llamarlo en viewDidAppear en lugar de viewDidLoad . Tuve un error similar y eso lo solucionó.


Usando el controlador de alerta:

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) })

Usando 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 } }


lo llamas antes de que se cierre la ventana y se muestre realmente el navigationController:

"Advertencia: intento de presentar en cuya vista no está en la jerarquía de la ventana!"

es probable que lo haga en applicationDidFinishLaunching?

O espere ... como hacerlo cuando la vista realmente aparece

O

un ''truco'' sería forzar la vista y ventana usted mismo:

[self.window addSubview:self.rootViewController.view]; [self.window makeKeyAndVisible];


prueba este código ...

-(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]; }