Display Alert Message from viewDidLoad

后端 未结 4 1364
孤街浪徒
孤街浪徒 2021-01-08 01:01

I want to display a alert message from viewDidLoad() method of ViewController.m instead from viewDidAppear() method.

Here is m

相关标签:
4条回答
  • 2021-01-08 01:09

    You have to embed a navigation controller and present the controller

    - (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
    
    }
    

    OR

      [self.view addSubview:alert.view];
      [self addChildViewController:alert];
      [alert didMoveToParentViewController:self];
    
    0 讨论(0)
  • 2021-01-08 01:10

    Swift 3 iOS 10, I used operation queue to put the block of code that updates the UI onto the main thread.

    import UIKit
    
    class ViewController2: UIViewController {
    
    var opQueue = OperationQueue()
    
    override func viewDidLoad() {
        super.viewDidLoad()
            let alert = UIAlertController(title: "MESSAGE", message: "HELLO WORLD!", preferredStyle: 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)
                })
            }
        }
    }
    

    In short we are using async. This allows the alert message to be displayed as expected (even when we are in viewDidLoad()).

    0 讨论(0)
  • 2021-01-08 01:14

    to move this call to the viewDidAppear: method.

    0 讨论(0)
  • 2021-01-08 01:16

    OK not a bug, the issue is that in viewDidLoad the view hierarchy is not fully set. If you use viewDidAppear, then the hierarchy is set.

    If you really want to call this alert in viewDidLoad you can do so by wrapping your presentation call in this GCD block to cause a slight delay, waiting for the next run loop, however I suggest you don't (it's ugly).

    dispatch_async(dispatch_get_main_queue(), ^ {
        [self presentViewController:alert animated:YES completion:nil];
    });
    
    0 讨论(0)
提交回复
热议问题