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

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

Я пытаюсь создать 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];
}

Как добавить представление в иерархию окон? Или, может быть, я делаю что-то очень плохое?

4b9b3361

Ответ 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, желайте, чтобы он помог.