Добавление представления в иерархию окон

Я пытаюсь создать экран паузы в своей игре. Я добавил viewController «PauseScreen» в свою раскадровку с идентификатором раскадровки и идентификатором восстановления, установленным как «PauseScreenID», и для перехода к экрану паузы я создал функцию в «GameScene»:

func pauseSceenTransition(){

    let viewController = UIStoryboard(name: "Main", bundle:nil).instantiateViewControllerWithIdentifier("PauseScreenID") as UIViewController

    let currentViewController = (UIApplication.sharedApplication().delegate as AppDelegate)

    currentViewController.window?.rootViewController?.presentViewController(viewController, animated: false, completion: nil)
}

Однако, когда он вызывается, я получаю сообщение об ошибке:

Предупреждение. Попытка представить ‹AppName.PauseScreen: 0x7fae61fe5ff0> в ‹AppName.StartScreenViewController: 0x7fae61f79980>, чье представление не находится в иерархии окон!

«StartScreenViewController» — это контроллер представления для моего начального экрана и начальный контроллер представления. Затем он переходит к «GameScene», куда должен перейти «PauseScreen». Это работает, если я сделаю начальный контроллер представления "GameViewController"/"GameScene", поэтому я предполагаю, что мне нужно изменить вторую строку:

let currentViewController = (UIApplication.sharedApplication().delegate as AppDelegate)

так что он представляет «PauseScreen» на «GameViewController», а не на «StartScreenViewController», но я не уверен, как это сделать.


person Ben Oneill    schedule 22.12.2014    source источник


Ответы (1)


Ошибка говорит вам, что именно происходит.

Warning: Attempt to present <AppName.PauseScreen: 0x7fae61fe5ff0> on <AppName.StartScreenViewController: 0x7fae61f79980> whose view is not in the window hierarchy!

(UIApplication.sharedApplication().delegate as AppDelegate).window?.rootViewController указывает на экземпляр StartScreenViewController. Это плохо: rootViewController должно указывать на экземпляр GameScene.

Основной причиной должно быть то, как представлено GameScene. Из вашего описания:

«StartScreenViewController» — это контроллер представления… Затем он переходит к «GameScene»…

Это должно быть, где ваша проблема. Как добраться до GameScene из StartScreenViewController?

Я предполагаю, что вы добавляете новое окно в приложение. Вместо этого вам нужно установить rootViewController.

let gameScene = UIStoryboard(name: "Main", bundle:nil).instantiateViewControllerWithIdentifier("GameSceneID") as UIViewController
let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
appDelegate.window?.rootViewController = gameScene

Когда вы вернетесь к начальному экрану, вы снова установите rootViewController.

let initialViewController = UIStoryboard(name: "Main", bundle:nil).instantiateInitialViewController() as UIViewController
let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
appDelegate.window?.rootViewController = initialViewController

Вы можете использовать transitionFromViewController(,toViewController:, duration:, options:, animations:, completion:) для анимации настройки корневого контроллера представления.

person Jeffery Thomas    schedule 22.12.2014
comment
Привет, у меня сейчас проблемы с этой же проблемой, и мне любопытно, изменились ли решения за последние полтора года. Я пытаюсь вызвать UIAlertController из вложенного if внутри кнопки. Обычные операторы if внутри кнопки отображают UIAlertView в порядке, но true результаты этих операторов if выдают ту же ошибку, что и выше. - person Ethan; 01.08.2016
comment
@Ethan Иногда вам нужно создать окно, чтобы поместить UIAlertController в: stackoverflow.com/questions/26554894/ - person Jeffery Thomas; 01.08.2016
comment
Что-нибудь, что вы знаете о том, что написано в свифт? - person Ethan; 01.08.2016
comment
@JefferyThomas Великий человек, ты спаситель!! Последние три дня я искал решение этой проблемы. Большое спасибо. - person Vinayak Bhor; 20.07.2018