I am trying to create a pause screen on my game. I have added a 'PauseScreen' viewController in my storyboard with the Storyboard ID and Restoration ID set as "PauseScreenID" and to move to the pause screen I have have created the function in "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)
}
However when the it gets called, I get the error :
Warning: Attempt to present <AppName.PauseScreen: 0x7fae61fe5ff0> on <AppName.StartScreenViewController: 0x7fae61f79980> whose view is not in the window hierarchy!
The "StartScreenViewController" is the view controller for my start screen and is the initial view controller. It then goes to the "GameScene" which is where the "PauseScreen" needs to go. It works if I make the initial view controller the "GameViewController"/"GameScene" so I presume that I need to change the second line:
let currentViewController = (UIApplication.sharedApplication().delegate as AppDelegate)
so that it is presenting the "PauseScreen" on the "GameViewController", not on the "StartScreenViewController" but I'm not sure how to do that.
The error is telling you exactly what's going on.
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
is pointing to an instance ofStartScreenViewController
. This is bad:rootViewController
should point to an instance ofGameScene
.The root cause must be how
GameScene
is presented. From your description:This must be where your problem is. How do you go to
GameScene
fromStartScreenViewController
?My guess is that you are adding a new window to the application. You need to set the
rootViewController
instead.When you go back to the start screen, you again set the
rootViewController
.You can use
transitionFromViewController(,toViewController:, duration:, options:, animations:, completion:)
to animate setting the root view controller.