web-dev-qa-db-ja.com

viewDidLoadからアラートメッセージを表示する

viewDidLoad()メソッドからではなく、_ViewController.m_のviewDidAppear()メソッドからアラートメッセージを表示したい。

これが私のコードです:

_- (void)viewDidLoad {
    [super viewDidLoad];

    //A SIMPLE ALERT DIALOG
    UIAlertController *alert =   [UIAlertController
                              alertControllerWithTitle:@"My Title"
                              message:@"Enter User Credentials"
                              preferredStyle:UIAlertControllerStyleAlert];


    UIAlertAction *cancelAction = [UIAlertAction
                               actionWithTitle:NSLocalizedString(@"Cancel", @"Cancel action")
                               style:UIAlertActionStyleCancel
                               handler:^(UIAlertAction *action)
                               {
                                   NSLog(@"Cancel action");
                               }];

    UIAlertAction *okAction = [UIAlertAction
                           actionWithTitle:NSLocalizedString(@"OK", @"OK action")
                           style:UIAlertActionStyleDefault
                           handler:^(UIAlertAction *action)
                           {
                               NSLog(@"OK action");
                           }];

    [alert addAction:cancelAction];
    [alert addAction:okAction];
    [self presentViewController:alert animated:YES completion:nil];
}
_

そして私はこのエラーを受け取ります:

警告:ビューがウィンドウ階層にない_<UIAlertController: 0x7fbc58448960>_に_<ViewController: 0x7fbc585a09d0>_を表示しようとしています!

14
Shivani Arorra

バグではありません。問題は、viewDidLoadでビュー階層が完全に設定されていないことです。 viewDidAppearを使用すると、階層が設定されます。

本当にこのアラートをviewDidLoadで呼び出したい場合は、プレゼンテーション呼び出しをこのGCDブロックでラップして、次の実行ループを待ってわずかな遅延を発生させることができますが、そうしないことをお勧めします't(醜いです)

dispatch_async(dispatch_get_main_queue(), ^ {
    [self presentViewController:alert animated:YES completion:nil];
});
22
Woodstock

この呼び出しをviewDidAppear:メソッドに移動します。

9
Akash

ナビゲーションコントローラーを埋め込み、コントローラーを提示する必要があります

- (void)viewDidLoad {
  [super viewDidLoad];

  //A SIMPLE ALERT DIALOG


   UIAlertController *alert =   [UIAlertController
                          alertControllerWithTitle:@"My Title"
                          message:@"Enter User Credentials"
                          preferredStyle:UIAlertControllerStyleAlert];


   UIAlertAction *cancelAction = [UIAlertAction
                           actionWithTitle:NSLocalizedString(@"Cancel", @"Cancel action")
                           style:UIAlertActionStyleCancel
                           handler:^(UIAlertAction *action)
                           {
                               NSLog(@"Cancel action");
                           }];

   UIAlertAction *okAction = [UIAlertAction
                       actionWithTitle:NSLocalizedString(@"OK", @"OK action")
                       style:UIAlertActionStyleDefault
                       handler:^(UIAlertAction *action)
                       {
                           NSLog(@"OK action");
                       }];

   [alert addAction:cancelAction];
   [alert addAction:okAction];

   [self.navigationController presentViewController:alert animated:NO completion:nil];
   //    [self presentViewController:cameraView animated:NO completion:nil]; //this will cause view is not in the window hierarchy error

}

[〜#〜]または[〜#〜]

  [self.view addSubview:alert.view];
  [self addChildViewController:alert];
  [alert didMoveToParentViewController:self];
0
Mayank Patel