Попытайтесь представить * на *, чей вид не находится в иерархии окон
Я пытаюсь создать modal view controller в своем делете приложения (я создал функцию, называемую showLoginView). Но всякий раз, когда я пытаюсь это назвать, я получаю предупреждение в XCode:
Warning: Attempt to present <PSLoginViewController: 0x1fda2b40> on <PSViewController: 0x1fda0720> whose view is not in the window hierarchy!
Здесь код метода:
- (void)showLoginView
{
PSLoginViewController *loginViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:NULL] instantiateViewControllerWithIdentifier:@"PSLoginViewController"];
[self.window.rootViewController presentViewController:loginViewController animated:NO completion:nil];
}
Как добавить представление в иерархию окон? Или, может быть, я делаю что-то очень плохое?
Ответы
Ответ 1
Вы не можете отобразить контроллер модального представления из приложения appDelegate. Вам нужно отобразить модальный ViewController из того, что в настоящее время отображается в полноэкранном режиме viewController. Другими словами, вам нужно поместить этот код в свой контроллер корневого представления или в зависимости от того, какой вы хотите отобразить модальный vc из...
Кроме того, вы хотите использовать метод "presentModalViewController" для представления модального. Вы можете установить свойства для модального vc, например:
vC.modalPresentationStyle = UIModalPresentationFormSheet;
vC.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:vC animated:YES];
Ответ 2
Фактически вы можете представить Modal view Controller из AppDelegate до тех пор, пока вы обнаружите текущий видимый контроллер viewController и позаботитесь о том, где текущий контроллер является навигационным контроллером.
Вот что я делаю:
UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController;
if ([activeController isKindOfClass:[UINavigationController class]]) {
activeController = [(UINavigationController*) activeController visibleViewController];
}
[activeController presentModalViewController:loginViewController animated:YES];
Ответ 3
UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController;
if ([activeController isKindOfClass:[UINavigationController class]])
{
activeController = [(UINavigationController*) activeController visibleViewController];
}
else if (activeController.modalViewController)
{
activeController = activeController.modalViewController;
}
[activeController presentModalViewController:vc animated:YES];
Ответ 4
Я столкнулся с этой проблемой на iOS 7 - ключом к тому, чтобы любая из предлагаемых решений работала, заключалась в вызове
[self.window makeKeyAndVisible];
в AppDelegate
.
После этого вызова обработал модальный вид из окна rootViewController
.
Ответ 5
Другая причина этого предупреждения может заключаться в том, что вы хотите представить контроллер представления из экземпляра, который не является главным контроллером представления.
Итак, сначала вы должны получить самый верхний UIViewController и использовать этот экземпляр для вызова presentViewController:
UIViewController *root = [UIApplication sharedApplication].keyWindow.rootViewController;
while (root.presentedViewController) {
root = root.presentedViewController;
}
Ответ 6
Вы можете NSLog (@ "% @", self.window.rootViewController) и посмотреть, что на самом деле имеет rootViewController.
Я столкнулся с этой проблемой, когда rootViewController является обычным UIViewController.
Замените его на UINavigationController, желайте, чтобы он помог.