Подтвердить что ты не робот

Предупреждение: попытайтесь представить ViewController, чей вид не находится в иерархии окон

В одном из моих приложений я вызываю viewController из метода application didReceiveLocalNotification. Страница загружается успешно, но она показывает предупреждение как:

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

Мой код выглядит следующим образом:

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

Ответ 1

Наконец, я решил эту проблему со следующим кодом.

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

Ответ 2

Помещенный

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

в функцию, например,

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

а затем вызовите его следующим образом:

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

Проблема была описана здесь и почему эта performSelector:withObject:afterDelay устраняет эту проблему? Поскольку селектор не будет вызываться до следующего запуска цикла выполнения. Итак, у всех есть время, чтобы успокоиться, и вы просто пропустите один цикл цикла.

Ответ 3

По моему предположению, мне кажется, что вы пытаетесь представить myView из self.viewController до того, как self.viewController прикреплен или помещен в иерархию окон. Поэтому просто убедитесь, что myView отображается self.viewController после появления/прикрепления к окну self.viewController.

Почему диспетчер модального представления не может видеть другого в viewDidLoad?

Ответ 4

это может быть связано с тем, что представление viewcontroller в настоящее время не загружается в иерархию окон, когда представлен VC...

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

Ответ 5

У меня была аналогичная проблема, я вызывал currentViewController из моего AppDelegate.m, когда приложение вошло на передний план:

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

Это не сработало, поскольку он сначала отклоняет контроллер представления (независимо от того, какие представления были на него наброшены), если он присутствует перед представлением контроллера входа в систему. Если нет, я могу сразу представить диспетчер входа в систему.

Ответ 6

Край:

Некоторые люди могут найти это через Google, и стоит отметить, что иногда эта ошибка возникает, если вы загружаете представление как контроллер корневого представления, который не помечен как начальный вид в Storyboard (и другое представление), а затем вы загружаете другой вид сверху. Например, в разделе "Входные представления", которые программно загружаются из метода applicationdidfinish... делегата приложения. Просто измените начальный вид (перетащите стрелку в Storyboard) в соответствующую для вашей иерархии. Эзотерический, расплывчатый, но заслуживающий внимания.

Ответ 7

Если вы используете свой идентификатор типа UINavigationController, вы можете его использовать.

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

Надеюсь, это поможет вам. Все самое лучшее!!!

Ответ 8

Для Swift 2.0 я использовал переопределение для viewDidAppear с помощью:

let vc = self.storyboard?.instantiateViewControllerWithIdentifier( "Второй" ) как! SecondViewController

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

Где "Второй" - это идентификатор раскадровки второго контролера в инспекторе идентификации.

Ответ 9

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