web-dev-qa-db-ja.com

AppDelegateからUIAlertControllerを提示する

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!

エラーの原因は何ですか?どのように修正しますか?

34
Satre

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)
        })
28
Aditya Gaonkar

このコードを試してください。

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

次のようなものを使用することをお勧めします。

var hostVC = self.window?.rootViewController

while let next = hostVC?.presentedViewController {
    hostVC = next
}

hostVC?.presentViewController(alertController, animated: true, completion: nil)

既にモーダルビューコントローラーを表示している場合、以前の回答は機能しません。

13
Mikhail Mkl

ウィンドウが起動し、navigationControllerが実際に表示される前に呼び出します。

「警告:ビューがウィンドウ階層にないユーザーにプレゼンテーションを試みます!」

applicationDidFinishLaunchingでそうする可能性がありますか?


どちらも待って..ビューが実際に表示されたときに行う

OR

1つの「ハック」は、ビューとウィンドウを自分で強制することです。

[self.window addSubview:self.rootViewController.view];
[self.window makeKeyAndVisible];
5
Daij-Djan

私は同じことを試みていましたが、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()
}
2
Kevin

viewDidAppearの代わりにviewDidLoadで呼び出すことができます。私は同様のエラーがあり、それを修正しました。

1
kakubei