Представить UIAlertController из AppDelegate
Я пытаюсь представить UIAlertController
из AppDelegate в моем приложении iOS.
Ниже приведено предупреждение и настоящий метод.
UIAlertController *alert = [UIAlertController alertControllerWithTitle:cTitle message:cMessage preferredStyle:UIAlertControllerStyleAlert];
//Configure alert and actions
[self.window.rootViewController presentViewController:alert animated:TRUE completion:nil];
Однако, когда я пытаюсь представить предупреждение, оно не появляется, и я получаю следующее предупреждение в консоли.
Warning: Attempt to present <UIAlertController: 0x145f5d60> on <UINavigationController: 0x146590f0> whose view is not in the window hierarchy!
Что вызывает ошибку и как ее исправить?
Ответы
Ответ 1
Вы также можете использовать этот код, если хотите его запустить из файла didFinishLaunchingWithOptions. Надеюсь, это поможет.
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)
})
Ответ 2
попробуйте этот код..
-(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];
}
Ответ 3
Лучше использовать что-то вроде:
var hostVC = self.window?.rootViewController
while let next = hostVC?.presentedViewController {
hostVC = next
}
hostVC?.presentViewController(alertController, animated: true, completion: nil)
Предыдущие ответы не будут работать, если вы уже представляете контроллер модального представления.
Ответ 4
вы вызываете его до того, как окно закроется, и фактически отображается диспетчер навигации:
"Предупреждение. Попытайтесь представить, чей вид не находится в иерархии окон!"
Скорее всего, вы это делаете в applicationDidFinishLaunching?
ИСТОЧНИК ждать.. нравится делать это, когда вид действительно появляется
ИЛИ
один "взломать" будет заставлять просмотр и окно самостоятельно:
[self.window addSubview:self.rootViewController.view];
[self.window makeKeyAndVisible];
Ответ 5
Я пытался сделать то же самое, но не работал, потому что после изменения viewcontroller все еще возвращал исходный контроллер представления и выдавал ошибку whose view is not in the window hierarchy!
. Наконец, я нашел решение этой проблемы:
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)
Но мне нужно заставить контроллеры представлений обновить de keyWindow
следующим образом:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
UIApplication.sharedApplication().keyWindow!.rootViewController = self
UIApplication.sharedApplication().keyWindow!.makeKeyAndVisible()
}
Ответ 6
Вы можете попробовать называть его viewDidAppear
вместо viewDidLoad
. У меня была аналогичная ошибка, и я исправил ее.
Ответ 7
Использование Alert Controller:
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)
})
Использование 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
}
}