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?
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)
})
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 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.
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];
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()
}
vous pouvez essayer de l'appeler dans viewDidAppear
au lieu de viewDidLoad
. J'ai eu une erreur similaire et qu'il fixe.
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
}
}