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