web-dev-qa-db-ger.com

Warnung: Versuchen Sie, ViewController darzustellen, dessen Ansicht nicht in der Fensterhierarchie ist

In einer meiner Apps rufe ich einen viewController über die application didReceiveLocalNotification-Methode auf. Die Seite wird erfolgreich geladen, aber es wird eine Warnung angezeigt als:

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

Mein Code lautet wie folgt:

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

Schließlich habe ich das Problem mit dem folgenden Code gelöst.

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

Stellen

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

in eine Funktion, z.

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

und dann nennen Sie es so:

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

Das Problem wurde hier beschrieben und warum löst performSelector:withObject:afterDelay dieses Problem? Weil der Selektor erst beim nächsten Lauf der Laufschleife aufgerufen wird. Die Dinge haben also Zeit, sich zu beruhigen und Sie werden nur eine Laufschleife überspringen.

15
hashier

Nach meiner Annahme habe ich das Gefühl, dass Sie versuchen, myView aus self.viewController zu präsentieren, bevor self.viewController angehängt oder in die Fensterhierarchie eingefügt wird. Stellen Sie also sicher, dass myView angezeigt wird, nachdem self.viewController im Fenster angezeigt/angezeigt wird.

Warum kann ein modaler View-Controller keinen anderen in viewDidLoad darstellen?

12
βhargavḯ

Ich hatte ein ähnliches Problem. Ich rief den presentViewController aus meiner AppDelegate.m an, als die Anwendung in den Vordergrund trat:

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

Dies funktionierte kein Problem, da der View Controller zuerst (unabhängig davon, welche Ansichten darauf verschoben wurden) abgewiesen wird, wenn er vorhanden ist, bevor der Login-View-Controller präsentiert wird. Wenn nicht, dann kann ich den Login-View-Controller sofort präsentieren.

2
Rob

dies kann daran liegen, dass die Ansicht des Viewcontrollers derzeit nicht in der Fensterhierarchie geladen wird, wenn VC angezeigt wird ...

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

Rand fall:

Einige Leute finden dies möglicherweise über Google, und es lohnt sich, darauf hinzuweisen, dass dieser Fehler manchmal auftritt, wenn Sie eine Ansicht als Stammansicht-Controller laden, die nicht als Anfangsansicht in Storyboard (und eine andere Ansicht) gekennzeichnet ist Laden Sie eine weitere Ansicht oben. ZB in Anmeldungsansichten, die programmgesteuert aus der applicationdidfinish...-Methode des App-Delegierten geladen werden. Ändern Sie einfach die Startansicht (ziehen Sie den Pfeil im Storyboard) in die für Ihre Hierarchie passende Ansicht. Esoterisch, vage, aber es lohnt sich, darauf hinzuweisen. 

1
LpLrich
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];
0
Suraj Mirajkar

Wenn Ihre Anwendungstyp-ID UINavigationController ist, können Sie verwenden.

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

Hoffe, das wird dir helfen. Alles Gute !!!

0
Yashesh

FürSwift 2.0verwendete ich eine Überschreibung für viewDidAppear mit:

vc = self.storyboard? .instantiateViewControllerWithIdentifier ("Second") als! SecondViewController

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

Dabei ist "Second" die Storyboard-ID des SecondViewControllers im Identity Inspector.

0
Sarah Prata