Mostrar post de alerta de viewDidLoad

Quiero mostrar un post de alerta desde el método viewDidLoad() de ViewController.m lugar del método viewDidAppear() .

Aquí está mi código:

 - (void)viewDidLoad { [super viewDidLoad]; //A SIMPLE ALERT DIALOG UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"My Title" message:@"Enter User Cnetworkingentials" prefernetworkingStyle: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]; } 

y estoy recibiendo este error:

Advertencia: Intente presentar <UIAlertController: 0x7fbc58448960> en <ViewController: 0x7fbc585a09d0> cuya vista no está en la jerarquía de windows!

OK, no es un error, el problema es que en viewDidLoad, la jerarquía de vista no está configurada por completo. Si usa viewDidAppear, entonces la jerarquía está configurada.

Si realmente desea llamar a esta alerta en viewDidLoad, puede hacerlo envolviendo su llamada de presentación en este bloque GCD para causar un ligero retraso, esperando el siguiente ciclo de ejecución, pero sugiero que no lo haga (es feo).

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

para mover esta llamada al método viewDidAppear:.

Tienes que incrustar un controller de navigation y presentar el controller

 - (void)viewDidLoad { [super viewDidLoad]; //A SIMPLE ALERT DIALOG UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"My Title" message:@"Enter User Cnetworkingentials" prefernetworkingStyle: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 } 

O

  [self.view addSubview:alert.view]; [self addChildViewController:alert]; [alert didMoveToParentViewController:self]; 

Swift 3 iOS 10, utilicé la queue de operaciones para poner el bloque de código que actualiza la interfaz de usuario en el hilo principal.

 import UIKit class ViewController2: UIViewController { var opQueue = OperationQueue() override func viewDidLoad() { super.viewDidLoad() let alert = UIAlertController(title: "MESSAGE", message: "HELLO WORLD!", prefernetworkingStyle: UIAlertControllerStyle.alert) // add an action (button, we can add more than 1 buttons) alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)) // show the alert self.opQueue.addOperation { // Put queue to the main thread which will update the UI OperationQueue.main.addOperation({ self.present(alert, animated: true, completion: nil) }) } } } 

En resumen, estamos usando async. Esto permite que el post de alerta se muestre como se esperaba (incluso cuando estamos en viewDidLoad ()).