2016-12-03 4 views
1

Ich habe meine GameViewController, die eine SCNView enthält. Ich kann zu meinem GameViewController übergehen, aber wenn mein Spieler stirbt, versuche ich, zu meinem GameOverVC zu wechseln, aber es geht nicht weiter. Ich weiß, dass der Code aufgerufen wird, weil ich etwas auf die Konsole drucke. Der Übergang wird im Storyboard festgelegt.UIViewController wird nicht zu einem anderen UIViewController geleitet?

enter image description here

I segue von

self.performSegue(withIdentifier: "gameOver", sender: self) 

Aufruf ich dies in mehreren Apps getan haben, aber ich kann nicht herausfinden, warum dies nicht funktioniert. Dies ist meine erste App mit SceneKit, also weiß ich nicht, ob das irgendetwas ändert, aber jede Hilfe wird geschätzt!

Auch

Wenn ich versuche,

let vc = self.view.window?.rootViewController 

vc?.present(GameOverVC(), animated: true, completion: nil) 

Dann macht es die UIViewController zu präsentieren, aber es zeigt nicht alles, was ich in dieser Ansicht hinzugefügt haben?

+0

aktualisieren Sie Ihre Frage mit Ihrem Storyboard, das Sie segue setzen. –

+0

der Name davon?oder meinst du ein Bild? –

+0

Bild, das die Segmentkennung –

Antwort

1

Irgendwie hatte ich das gleiche Problem und asynchron rufen Sie mich retten: Ich habe so etwas wie dies:

DispatchQueue.main.asyncAfter(deadline: .now()) { 

     self.performSegue(withIdentifier: "gameOver", sender: self) 
    } 

, wenn Sie von einem Objekt segue benötigen, die nicht ein Viewcontroller geerbte Klasse ist, müssen Sie eine ref des parent zu Ihrem Objekt zu übergeben und den Anruf tätigen wie folgt:

DispatchQueue.main.asyncAfter(deadline: .now()) { 

     parentViewController.performSegue(withIdentifier: "gameOver", sender: self) 
    } 
+0

Das hat mein Problem gelöst! Ich bin nicht sicher, warum die üblichen Methoden wie @Lion gepostet dieses Mal nicht funktioniert haben, aber ich wünschte, jemand könnte mir sagen, warum es in meinem Fall so gemacht werden muss. –

+0

Dieses Problem dauert einige Tage. Ich weiß nicht, warum gewöhnliche Übergänge nicht funktionieren. Wenn Sie verstehen, warum es so funktioniert, lassen Sie es mich wissen ... –

0

können Sie versuchen, folgende: -

UIViewController *vc = self.view.window.rootViewController; 
[vc performSegueWithIdentifier:@"id" sender:nil]; 
+0

Wenn ich dies versuche, stürzt meine App ab und druckt 'Receiver () hat keinen Übergang mit Bezeichner' gameOver ' –

+0

Kannst du scene.viewcontroller Objekt in deiner Szene? Wenn ja, führe das Objekt aus. –

+0

Nein, ich kann das nicht bekommen –

1

segue Werke für UIVIewControllers nicht für SpriteKit scenes. So müssen Sie segue von parent viewcontroller auszuführen, so dass Sie so etwas wie tun kann,

self.parentViewController.performSegue(withIdentifier: "gameOver", sender: self) 

Oder wie @ZeMoon in this answer erwähnt, können Sie Eigentum Ihrer viewcontroller in SKScene Klasse machen und Sie können segue über diese Eigenschaft etwas ausführen wie

,
class GameScene: SKScene { 
    var viewController: UIViewController? 
    ... 
} 

Dann wird in der Viewcontroller Klasse, kurz vor skView.presentScene(scene) tun,

scene.viewController = self 

Jetzt können Sie führen segue wie

self.viewController.performSegueWithIdentifier("gameOver", sender: self.viewController) 

ODER

segue Vergessen Sie einfach Ihre GameOverVC instanziiert und schieben Sie es auf Ihrem Navigationscontroller wie

let nav = self.view.window?.rootViewController as! UINavigationController 

    nav.pushViewController(gameOverVC, animated: true) 

Oder

self.navigationController?.pushViewController(gameOverVC, animated: true) 
+0

nichts davon funktioniert in meiner Situation –

Verwandte Themen