Предупреждение: попытайтесь представить 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];
}
Ответы
Ответ 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];