2013-03-08 17 views
30

In una delle mie app, sto chiamando un viewController dal metodo application didReceiveLocalNotification. La pagina viene caricata con successo, ma mostra un avvertimento come:Avviso: tentativo di presentare ViewController la cui vista non è nella gerarchia della finestra

Warning: Attempt to present <blankPageViewController: 0x1fda5190> on 
<ViewController: 0x1fd85330> whose view is not in the window hierarchy! 

Il mio codice è il seguente:

-(void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { 

    blankPageViewController *myView = [[blankPageViewController alloc] 
       initWithNibName:@"blankPageViewController" bundle: nil]; 
    myView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
    [self.viewController presentViewController:myView animated:NO completion:nil]; 
} 
+0

Quando si chiama didReceiveLocalNotification? –

+0

@Bhargavi: è un deligate che viene chiamato quando vengono ricevute le notifiche locali. –

risposta

21

Finalmente risolto tale problema con il seguente codice.

-(void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { 
     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
     self.blankviewController = [[blankPageViewController alloc] initWithNibName:@"blankPageViewController" bundle:nil]; 
     self.window.rootViewController = self.blankviewController; 
     [self.window makeKeyAndVisible]; 
} 
0

Se il vostro tipo di applicazione id UINavigationController quindi è possibile utilizzare.

-(void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { 

blankPageViewController *myView = [[blankPageViewController alloc] 
            initWithNibName:@"blankPageViewController" bundle: nil]; 
myView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self.navigationController presentViewController:myView animated:NO completion:nil]; } 

Spero che questo vi aiuterà. Tutto il meglio !!!

2

potrebbe essere a causa di vista della viewcontroller non è attualmente caricato nella gerarchia finestra quando VC è presentato ...

-(void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
{ 
    UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController; 
    rootViewController = [[navigationController viewControllers] objectAtIndex:0]; 
    blankPageViewController *myView = [[blankPageViewController alloc] initWithNibName:@"blankPageViewController" bundle: nil]; 
    [rootViewController presentModalViewController:myView animated:YES]; 
} 
+0

Grazie per il consiglio. Ho provato questo. Ha funzionato bene la prima volta, se la notifica appare di nuovo, sta mostrando lo stesso avvertimento ... :( –

+0

modificato ans dovrebbe funzionare ... – BhushanVU

12

Secondo la mia ipotesi, mi sento come si sta tentando di presentare myView da self.viewController prima self.viewController è collegato o inserito nella gerarchia delle finestre. Quindi assicurati di presentare myView dopo che self.viewController viene visualizzato/allegato alla finestra.

Why can't a modal view controller present another in viewDidLoad?

+1

Sì ... entrare in vistaDidAppear risolve completamente per me! –

2

ho avuto un problema simile, mi stava chiamando il presentViewController da dentro il mio AppDelegate.m quando l'applicazione è entrato in primo piano:

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    NSDate * lastActive = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastActive"]; 

    double interval = [[NSDate date] timeIntervalSinceDate:lastActive]; 

    NSLog(@"Time Interval: %f", interval); 

    if (interval > 900) { // interval is in seconds, so 900 seconds = 15 mins 
     Login *pres = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:@"login"]; 

     UINavigationController *navi = ((UINavigationController*)self.window.rootViewController); 
     if (navi.presentedViewController) { 
      [navi dismissViewControllerAnimated:YES completion:^{ 
       [navi presentViewController:pres animated:NO completion:nil]; 
      }]; 
     } else { 
      [navi presentViewController:pres animated:NO completion:nil]; 
     } 
    } 
} 

questo ha funzionato senza alcun problema in cui respinge il visualizzare prima il controller (indipendentemente da quali viste sono stati inseriti su di esso) se è presente prima di presentare il controller della vista di accesso. In caso contrario, posso presentare subito il controller della vista di accesso.

15

Put

[self.viewController presentViewController:myView animated:NO completion:nil]; 

in funzione ad esempio

- (void)yourNewFunction 
{ 
    [self.viewController presentViewController:myView animated:NO completion:nil]; 
} 

e quindi chiamare in questo modo:

[self performSelector:@selector(yourNewFunction) withObject:nil afterDelay:0.0]; 

Il problema descritto ottenuto here e perché fa questo performSelector:withObject:afterDelay risolvere questo problema? Perché il selettore non verrà chiamato fino alla prossima esecuzione del ciclo di esecuzione. Quindi le cose hanno il tempo di sistemarsi e tu salti solo un ciclo di corsa.

1

bordo di caso:

Alcune persone possono trovare questo attraverso Google e vale la pena sottolineare che a volte questo errore viene generato se si sta caricando una vista su come il controller della vista radice che non è etichettato come vista iniziale in Storyboard (& un'altra vista è) e quindi si carica un'altra vista in alto. Ad esempio, in Visualizzazioni di accesso caricate a livello di codice dal metodo applicationdidfinish... del delegato dell'app.Basta cambiare la vista iniziale (trascinare la freccia in Storyboard) su quella appropriata per la propria gerarchia. Esoterico, vago, ma degno di nota.

0

Per Swift 2.0 Ho usato un override per viewDidAppear con:

let vc = self.storyboard .instantiateViewControllerWithIdentifier ("Seconda") come?! SecondViewController

self.presentViewController(vc, animated: true, completion: nil) 

Dove "Second" è l'ID dello storyboard del SecondViewController nell'identificatore di identità.

0
I have used Navigation Controller and on which i have used a 
ModalViewController to present a Popup(Present over current context). 
From this Popup i am opening a ViewController Modally which 
caused the Warning. So to resolve i did below change: 

[self.presentedViewController performSegueWithIdentifier:@"PresentScreenSegueId" sender:sender]; 
Problemi correlati