2014-12-22 6 views
5

Ich versuche, einen Pausenbildschirm in meinem Spiel zu erstellen. Ich habe ein ‚PauseScreen‘ Viewcontroller in meinem Drehbuch mit dem Storyboard-ID und Restauration ID gesetzt als „PauseScreenID“ hinzugefügt und nach der Pause Bildschirm zu bewegen Ich habe die Funktion in „GameScene“ erstellt habe:Hinzufügen einer Ansicht zur Fensterhierarchie

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) 
} 

aber wenn die es aufgerufen wird, erhalte ich die Fehlermeldung:

Warnung: Versuch < AnwName .PauseScreen zu präsentieren: 0x7fae61fe5ff0> auf < AnwName .StartScreenViewController: 0x7fae61f79980> deren Ansicht ist nicht in der Fensterhierarchie!

Der "StartScreenViewController" ist der View-Controller für meinen Startbildschirm und ist der erste View-Controller. Dann geht es zur "GameScene", wo der "PauseScreen" hin muss. Es funktioniert, wenn ich den anfänglichen View-Controller des „GameViewController“/„GameScene“ machen, so nehme ich an, dass ich die zweite Zeile ändern muß:

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

so, dass es den „PauseScreen“ auf dem „GameViewController“ präsentiert nicht auf dem "StartScreenViewController", aber ich bin nicht sicher, wie das geht.

Antwort

11

Der Fehler sagt Ihnen genau, was vor sich geht.

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 zu einer Instanz von StartScreenViewController zeigt. Das ist schlecht: rootViewController sollte auf eine Instanz von GameScene zeigen.

Die Ursache muss sein, wie GameScene dargestellt wird. Aus Ihrer Beschreibung:

Die "StartScreenViewController" ist die View-Controller ... Es geht dann auf die "GameScene" ...

Dies muss sein, wo Ihr Problem ist. Wie gehst du zu GameScene von StartScreenViewController?

Meine Vermutung ist, dass Sie der Anwendung ein neues Fenster hinzufügen. Sie müssen stattdessen die rootViewController einstellen.

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

Wenn Sie zum Startbildschirm zurück, setzen Sie wieder die rootViewController.

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

können Sie transitionFromViewController(,toViewController:, duration:, options:, animations:, completion:) verwenden, um die Root-View-Controller zu animieren Einstellung.

+0

Hallo, ich habe jetzt Probleme mit dem gleichen Problem und bin gespannt, ob sich die Lösungen in den letzten anderthalb Jahren geändert haben. Ich versuche, einen 'UIAlertController' aus einem verschachtelten' if' innerhalb einer Schaltfläche aufzurufen. Die regulären 'if'-Anweisungen innerhalb der Schaltfläche zeigen die' UIAlertView'-Strafe an, aber die 'wahr'-Ergebnisse dieser if-Anweisungen werfen den gleichen Fehler darüber. – Ethan

+0

@Ethan Manchmal müssen Sie ein Fenster erstellen, um einen 'UIAlertController' in http: // stackoverflow zu setzen.com/questions/26554894/how-to-present-uialertcontroller-wenn-nicht-in-blick-controller –

+0

Alles, was Sie wissen, ist in swift geschrieben? – Ethan