IOSアプリでAppDelegateからUIAlertController
を表示しようとしています。以下はアラートと現在の方法です。
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!
エラーの原因は何ですか?どのように修正しますか?
DidFinishLaunchingWithOptions.Hopeから起動する場合にも、このコードを使用できます。
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)
})
このコードを試してください。
-(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];
}
次のようなものを使用することをお勧めします。
var hostVC = self.window?.rootViewController
while let next = hostVC?.presentedViewController {
hostVC = next
}
hostVC?.presentViewController(alertController, animated: true, completion: nil)
既にモーダルビューコントローラーを表示している場合、以前の回答は機能しません。
ウィンドウが起動し、navigationControllerが実際に表示される前に呼び出します。
「警告:ビューがウィンドウ階層にないユーザーにプレゼンテーションを試みます!」
applicationDidFinishLaunchingでそうする可能性がありますか?
どちらも待って..ビューが実際に表示されたときに行う
OR
1つの「ハック」は、ビューとウィンドウを自分で強制することです。
[self.window addSubview:self.rootViewController.view];
[self.window makeKeyAndVisible];
私は同じことを試みていましたが、ViewControllerの変更後も初期ViewControllerを返し、エラーをスローするため、動作しませんwhose view is not in the window hierarchy!
。最後に、この問題の解決策を見つけました。
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)
ただし、View Controllerでde keyWindow
を強制的に更新する必要があります。
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
UIApplication.sharedApplication().keyWindow!.rootViewController = self
UIApplication.sharedApplication().keyWindow!.makeKeyAndVisible()
}
viewDidAppear
の代わりにviewDidLoad
で呼び出すことができます。私は同様のエラーがあり、それを修正しました。