Wie auf den aktuellen Viewcontroller in einem Sprite-Kit-Szene
Ich bin eine harte Zeit der Suche nach der Antwort auf diese Frage, die ich annehmen, ist nicht schwer.
Wie kann ich mich auf die Methoden und Eigenschaften definiert, die auf einem viewcontroller aus einer SKScene ?
Und darauf aufbauend: Wie kann Sie auf die ViewController aus einer SKScene, die geladen wurde, in einer anderen SKScene?
Abrufen der aktuellen rootViewController sollte genug für Sie sein, es sei denn, Sie müssen etwas bestimmtes. Sie können es so machen [UIApplication sharedApplication].keyWindow.rootViewController; . Andere Lösung wäre, Unterklasse SKScene und geben es presentingVC-Eigenschaft, legen Sie diese Eigenschaft bei der Erstellung jeder Szene zu senden um.
Sie sollten es vermeiden, Referenz
Wie @AndreyGordeev erwähnt, sollten Sie wirklich vermeiden, verweisen auf Sie Szene viewController direkt. Es sollte nie zu wissen, über die viewController direkt. Was könnte es aber Sinn machen, ist die Implementierung einer delegate-Protokoll auf Ihrem SKScene-Unterklasse und die viewController, um diese zu delegieren. Vielleicht sollte man einen Schritt zurück treten und uns informieren, was Sie zu erreichen versuchen, sondern als eine Besondere Möglichkeit dies umzusetzen?
Ich fügte hinzu, Spiel-Center-Authentifizierung Logik, um mein Haupt-ViewController. Zur info ich arbeite mit einem einzigen viewcontroller als dies ist ein einfaches Spiel. Ich halte Eigenschaften auf meiner viewcontroller, verfolgen Allgemeine GameCenter Verfügbarkeit + den authentifizierten Benutzer. Nun, wenn mein Spiel endet, möchte ich, um meine Scores im gamecenter. So brauche ich, um in Kontakt mit meiner viewcontroller, um zu überprüfen, ob die gamecenter-Funktionalität ist verfügbar, und der Benutzer angemeldet ist. Ich will nicht, übergeben Sie die Eigenschaften für meinen SKScene, weil ich bin mir nicht sicher, was passieren wird, wenn der Benutzer wird nicht authentifiziert, während der Wiedergabe.
Sie sollten es vermeiden, Referenz
UIViewController
aus SKScene
, denn es bricht MVC-MusterWie @AndreyGordeev erwähnt, sollten Sie wirklich vermeiden, verweisen auf Sie Szene viewController direkt. Es sollte nie zu wissen, über die viewController direkt. Was könnte es aber Sinn machen, ist die Implementierung einer delegate-Protokoll auf Ihrem SKScene-Unterklasse und die viewController, um diese zu delegieren. Vielleicht sollte man einen Schritt zurück treten und uns informieren, was Sie zu erreichen versuchen, sondern als eine Besondere Möglichkeit dies umzusetzen?
Ich fügte hinzu, Spiel-Center-Authentifizierung Logik, um mein Haupt-ViewController. Zur info ich arbeite mit einem einzigen viewcontroller als dies ist ein einfaches Spiel. Ich halte Eigenschaften auf meiner viewcontroller, verfolgen Allgemeine GameCenter Verfügbarkeit + den authentifizierten Benutzer. Nun, wenn mein Spiel endet, möchte ich, um meine Scores im gamecenter. So brauche ich, um in Kontakt mit meiner viewcontroller, um zu überprüfen, ob die gamecenter-Funktionalität ist verfügbar, und der Benutzer angemeldet ist. Ich will nicht, übergeben Sie die Eigenschaften für meinen SKScene, weil ich bin mir nicht sicher, was passieren wird, wenn der Benutzer wird nicht authentifiziert, während der Wiedergabe.
InformationsquelleAutor stvn | 2014-02-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine bessere Möglichkeit, als meinen "zurück-Verweis" zu beantworten ist ein Protokoll explizit definieren, die Methoden, die ein
SKScene
Unterklasse erwartet, dass dieUIViewController
Unterklasse zu implementieren. Hier sind die Schritte, die Sie brauchen, um durch zu gehen.1) Definieren Sie das Protokoll (Vertrag), dass die
UIViewController
annehmen müssen, um und passen sich an an:2) Die
UIViewController
Unterklasse nun nimmt das Protokoll:class GameViewController: UIViewController,GameManager{
3) Die
GameScene
bekommt ein ivar, der auf denUIViewController
:var gameManager:GameManager?
4) Wenn die
GameManager
braucht, um dieUIViewController
sieht es so wie dieses:gameManager.loadHighScoreScene()
Wir haben jetzt einen gut definierten Vertrags, was eine
GameManager
ist. Jeder andere Entwickler (und die aktuelle Entwickler-die Zukunft selbst), dass die Arbeit an diesem Projekt nun wissen, welche Methoden einGameManager
implementieren sollten. Das heißt, wir könnten einfach Anschluss dieser code zu einem anderen Projekt (und somit ein anderesUIViewController
) und es würde immer noch funktionieren, solange diese neueUIViewController
nahm dieGameManager
Protokoll.Ähnlich, wenn wir uns bewegen unsere Szene-navigation-code aus der view-controller, und stattdessen legte es in eine singleton-Klasse, die das singleton-Klasse hätte nur annehmen müssen, um die
GameManager
Protokoll.Ansatz?
Dieser thread gibt 4 Ansätze zur Lösung des Problems, und ich habe persönlich alle 4. Hier ist mein nehmen auf Sie:
1) Hart codiert ein Aufruf der
UIViewController
Unterklasse:(self.view!.window!.rootViewController as! GameViewController).loadGameScene(1)
Vorteil: 1 Zeile code!
Nachteil: Eine sehr enge Kopplung von 2 Klassen ohne expliziten Vertrag.
2) Mit einem Zeiger zurück zu den
UIViewController
:Vorteile: Sehr wenig code, der benötigt wird, Kein Protokoll erforderlich.
Nachteile: Enge Kopplung von 2 Klassen. Keine expliziten Vertrag.
3) Mit
NSNotificationCenter
:Vorteil: Lose gekoppelten Klassen.
Nachteile: mehr code benötigt, um die Sender -, Empfänger-und callback-Methoden. Härter, für die Ablaufverfolgung und Debuggen von code. Keine expliziten Vertrag. Die "eins-zu-viele" - Fähigkeit von Benachrichtigungen ist nett, aber hilft uns nicht hier.
4) Erstellen eines Protokolls:
Vorteile: Ein expliziter Vertrag. Die Götter des MVC wird es freuen.
Nachteil: Mehr code zu schreiben (aber viel weniger als Benachrichtigungen).
InformationsquelleAutor tonethar
Sollten Sie vermeiden, zu verweisen
UIViewController
ausSKScene
, denn es bricht MVC-Muster.Als eine alternative Methode, die Sie verwenden können
NSNotificationCenter
zu BenachrichtigenUIViewController
über high score:In
ViewController
:In
SKScene
:InformationsquelleAutor Andrey Gordeev
in der Theorie sollten Sie es nicht tun, aber in der Praxis...
(self.view!.window!.rootViewController as! GameViewController).loadGameScene()
InformationsquelleAutor J. V.
Vielen Dank für Ihre NSNotification-Methode zum beenden einer sprite-kit-Szene zurück an die aufrufende view-controller. Dies ist ein einfacher Weg, um zurück zu wechseln, UIKit & werde nach meinem code. Ich bin die Arbeit ist schnell & einfach Hinzugefügt 4 Zeilen von code für die Arbeit in Swift. Dieser code wurde Hinzugefügt, um die view-controller in die Kommentarzeichen vor der viewDidLoad-Funktion.
Fügte ich diesen code auf meine touchesBegan Funktion in meinem SKscene, um wieder zur view-controller
Nun, wenn ich auf den "beenden" labelNode, wird es lassen Sie mich führen Sie eine Funktion namens quitToLevel in der view-controller vorgestellt, dass meine Szene. Diese Funktion öffnet mich wieder auf mein main Bildschirm, da bin ich mit einem navigation-controller, konnte aber für jeden Zweck verwendet werden.
Ich habe versucht, mehrere andere Methoden zum beenden einer Szene, hatte aber Probleme, wenn ich springen wollte um in mehreren Szenen zu verlieren, die Referenz zurück auf den view-controller. Ich kann nutzen diese Methode von einer beliebigen Szene
InformationsquelleAutor ronsinda
Dies ist nicht die eleganteste Lösung, aber wie wäre es mit einem "back reference" aus Ihrem SKScene Unterklasse der GameViewController? So etwas wie dieses:
Ihre SKScene Unterklasse sieht wie folgt aus:
und später:
SKNode und Ihre Unterklassen haben bereits eine
.parent
und ein.scene
Eigenschaft, so ist es nicht wie dieser Ansatz ist unerhört.Ja, wir sind hart-Codierung eine Abhängigkeit und enger Kopplung unserem code, aber wir schreiben weniger code, also kann es nicht schlecht sein.
InformationsquelleAutor tonethar