2016-01-09 13 views
8

Ich möchte eine Alarmmeldung von viewDidLoad() Methode von ViewController.m statt von viewDidAppear() Methode anzeigen.Alarmmeldung von viewDidLoad anzeigen

Hier ist mein Code:

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

und ich erhalte diese Störung:

Warning: Attempt to present <UIAlertController: 0x7fbc58448960> on <ViewController: 0x7fbc585a09d0> whose view is not in the window hierarchy!

+1

Mögliches Duplikat von [wessen Ansicht ist nicht in der Fensterhierarchie] (http://stackoverflow.com/questions/11862883/whre-view-is-not-in-the-window-hierarchy) – Woodstock

+0

@Woodstock meine Frage ist anders ... –

Antwort

12

OK, kein Fehler, das Problem ist, dass in ViewDidLoad die Ansichtshierarchie nicht vollständig festgelegt ist. Wenn Sie viewDidAppear verwenden, wird die Hierarchie festgelegt.

Wenn Sie diese Warnung wirklich in viewDidLoad aufrufen möchten, können Sie dies tun, indem Sie Ihren Präsentationsaufruf in diesen GCD-Block einfügen, um eine leichte Verzögerung zu verursachen. Warten Sie jedoch auf die nächste Ausführungsschleife hässlich).

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

Vielen Dank für Ihre Antwort .. Dies funktioniert :) –

+1

mein Vergnügen, nur eine Anmerkung, dass, obwohl das obige funktioniert, ich denke, Apple hat nicht die Warnungen in viewDidLoad präsentiert werden, weil es sehr früh im ViewController-Lebenszyklus ist. – Woodstock

+0

Ok .. Ich behielt diesen Punkt in meinen Gedanken –

0

Sie haben ein Navigationscontroller einzubetten und die Steuerung

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

} 

präsentieren OR

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

ich versuche deinen vorgeschlagenen code. aber App ist abgestürzt, wenn ich auf einen beliebigen Knopf, dh OK, Abbrechen .. und auch Alarm-Box wird auf der oberen linken Seite angezeigt –

+0

@ShivaniArorra ich habe meine ans aktualisiert das müssen Sie tun '[self.navigationController presentViewController: Alarm animiert : NO completion: nil]; ' –

8

, um diesen Aufruf in die viewDidAppear: -Methode zu verschieben.

+0

Sie haben Recht, ich denke, das sollte jedoch von viewDidLoad aufrufbar sein. – Woodstock

+0

aber ich möchte Formular aufrufenDidLoad: Methode –

-1

Swift 3 IOS 10, verwendete ich Operations-Warteschlange den Block von Code zu setzen, der die UI auf den Haupt-Thread aktualisiert.

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

Kurz gesagt, wir verwenden async. Dadurch kann die Warnmeldung wie erwartet angezeigt werden (auch wenn wir in viewDidLoad() sind).

+0

Dies fügt tatsächlich einen Block zu einer lokalen Operationswarteschlange hinzu, die der Hauptoperationswarteschlange einen weiteren Block hinzufügt, der dann die Warnung darstellt. Es ist normal, dafür eine Dispatch Queue zu verwenden: 'DispatchQueue.main.async {...}'. –

Verwandte Themen