2013-03-08 9 views
30

W jednej z moich aplikacji wywoływana jest metoda viewController z metody application didReceiveLocalNotification. Że strona ładuje się pomyślnie, ale to pokazuje jak ostrzeżenie:Ostrzeżenie: próba przedstawienia kontrolki ViewController, której widok nie znajduje się w hierarchii okna.

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

Mój kod wygląda następująco:

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

Kiedy dzwonisz na didReceiveLocalNotification? –

+0

@Bhargavi: jest to deligia, która jest wywoływana po otrzymaniu powiadomienia lokalnego. –

Odpowiedz

21

końcu rozwiązał ten problem za pomocą następującego kodu.

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

Jeśli typ aplikacji id UINavigationController następnie można użyć.

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

Mam nadzieję, że to ci pomoże. Wszystkiego najlepszego !!!

2

możliwe że pogląd viewcontroller nie jest aktualnie załadowany w oknie hierarchii gdy VC jest przedstawiony ...

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

Dzięki za poradę. Próbowałem tego. Po raz pierwszy zadziałało dobrze, jeśli powiadomienie pojawi się ponownie, pokazuje to samo ostrzeżenie ... :( –

+0

edytowane ans powinno działać ... – BhushanVU

12

Jak na moje założenie, czuję się jak starają się przedstawić myView od self.viewController przed self.viewController jest dołączony lub umieszczony w hierarchii okna. Dlatego po myView po self.viewController pojawi się/załączony do okna.

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

+1

Tak ... Przenieś się do widokuDidAppear całkowicie rozwiązuje to dla mnie! –

2

miałem podobny problem, byłem wywołanie presentViewController od wewnątrz mojego AppDelegate.m gdy aplikacja wszedł na pierwszy plan:

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

To działało bez problemu, gdyż odrzuci najpierw kontroler widoku (niezależnie od tego, jakie widoki zostały na niego wepchnięte), jeśli jest obecny przed wyświetleniem kontrolera widoku logowania. Jeśli nie, mogę od razu pokazać kontroler widoku logowania.

15

umieścić

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

w zależności np

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

a następnie nazwać tak:

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

Problem został opisany here i dlaczego robi to performSelector:withObject:afterDelay rozwiązać ten problem? Ponieważ selektor nie zostanie wywołany do następnego uruchomienia pętli uruchamiania. Więc czas się uspokoi i po prostu opuścisz jedną pętlę.

1

krawędzi koperty:

Niektórzy ludzie mogą znaleźć to za pośrednictwem Google i warto zaznaczyć, że czasami ten błąd jest podniesiona jeśli ładujesz pogląd jako kontroler widoku głównego, które nie są oznaczone jako widoku początkowego w Storyboard (& inny widok jest), a następnie ładujesz inny widok na wierzchu. Np. W widokach dziennika, które są ładowane programowo z poziomu metody applicationdidfinish... Delegata aplikacji.Po prostu zmień początkowy widok (przeciągnij strzałkę w Storyboard) do odpowiedniej dla swojej hierarchii. Ezoteryka, niejasna, ale warta podkreślenia.

0

Dla Swift 2.0 użyłem nadpisanie viewDidAppear z:

let vc = self.storyboard .instantiateViewControllerWithIdentifier ("drugi") jak?! SecondViewController

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

Gdzie "Second" jest identyfikatorem urządzenia SecondViewController w inspektorze tożsamości.

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]; 
Powiązane problemy