2014-12-22 13 views
5

Sto provando a creare una schermata di pausa sul mio gioco. Ho aggiunto un 'PauseScreen' viewController nel mio storyboard con Storyboard ID e ID Restauro impostato come "PauseScreenID" e per passare alla schermata di pausa che ho creato la funzione di "GameScene":Aggiunta di una vista alla gerarchia della finestra

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

Tuttavia quando il che viene chiamato, ottengo l'errore:

Attenzione: tentativo di presentare < NomeApp .PauseScreen: 0x7fae61fe5ff0> sulla < NomeApp .StartScreenViewController: 0x7fae61f79980> la cui vista non è nella gerarchia delle finestre!

"StartScreenViewController" è il controller di visualizzazione per la schermata iniziale ed è il controller di visualizzazione iniziale. Passa quindi al "GameScene", che è dove deve andare "PauseScreen". Funziona se faccio la vista del regolatore iniziale "GameViewController"/"GameScene" così presumo che ho bisogno di cambiare la seconda linea:

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

in modo che presenta la "PauseScreen" sul "GameViewController" , non su "StartScreenViewController", ma non sono sicuro di come farlo.

risposta

11

L'errore ti dice esattamente cosa sta succedendo.

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 sta indicando un'istanza di StartScreenViewController. Questo non è corretto: rootViewController dovrebbe puntare a un'istanza di GameScene.

La causa principale deve essere la presentazione di GameScene. Dalla tua descrizione:

Il "StartScreenViewController" è il controller della vista ... Si passa quindi alla "GameScene" ...

Questo deve essere dove il problema è. Come vai a GameScene da StartScreenViewController?

La mia ipotesi è che si sta aggiungendo una nuova finestra all'applicazione. Devi invece impostare rootViewController.

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

Quando si torna alla schermata iniziale, è ancora una volta impostato il rootViewController.

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

È possibile utilizzare transitionFromViewController(,toViewController:, duration:, options:, animations:, completion:) per animare l'impostazione del controller della vista root.

+0

Ciao, sto avendo problemi con questo stesso problema ora, e sono curioso di sapere se le soluzioni sono cambiate nell'ultimo anno e mezzo. Sto cercando di chiamare un 'UIAlertController' all'interno di un nidificato' if' all'interno di un pulsante. Le normali istruzioni "if" all'interno del pulsante mostrano "UIAlertView" bene, ma i risultati "true" di quelle if se lanciano lo stesso errore sopra. – Ethan

+0

@Ethan A volte è necessario creare una finestra per mettere un 'UIAlertController' in: http: // stackoverflow.it/questions/26554894/how-to-present-uialertcontroller-when-not-in-a-view-controller –

+0

Tutto ciò che sai è scritto in modo rapido? – Ethan