Ich habe ein funktionierendes einfaches Einzelspieler-Spiel, bei dem der anfängliche View-Controller eine Taste hat, um das Spiel zu starten. Diese Schaltfläche führt einen Übergang durch und alle Spiellogik im GameViewController funktioniert wie erwartet.Warnung: Versuch, den View-Controller auf einem anderen View-Controller darzustellen, dessen View nicht in der Fensterhierarchie ist.
Ich habe this tutorial gefolgt, um Multi-Player-Funktionalität zu meinem Spiel hinzuzufügen. auf dem Einstiegs View-Controller, eine Taste ruft nun
GameKitHelper.sharedGameKitHelper.findMatchWithMinPlayers(2, maxPlayers: 2, viewController: self, delegate: MultiPlayerNetworking)
}
, die die folgende Implementierung in GameKitHelper.swift hat:
func findMatchWithMinPlayers (minPlayers: Int, maxPlayers: Int, viewController: UIViewController, delegate: GameKitHelperDelegate) {
matchStarted = false
let request = GKMatchRequest()
self.delegate = delegate
request.minPlayers = 2
request.maxPlayers = 2
presentingViewController = viewController
presentingViewController.dismissViewControllerAnimated(false, completion: nil)
let mmvc = GKMatchmakerViewController(matchRequest: request)
mmvc?.matchmakerDelegate = self
presentingViewController.presentViewController(mmvc!, animated: true, completion: nil)
self.delegate?.matchStarted()
}
Die Klasse MultiPlayerNetworking implementiert das GameKitHelper Protokoll, und wird auf der matchStarted Funktion aufgerufen . Die MultiPlayerNetworking-Klasse übernimmt hier im Wesentlichen die Aufgabe und sendet Nachrichten an Hosts und Remote-Player.
Beachten Sie, dass einige Zeit später Wenn die automatische Anpassung beendet, wird die folgende Funktion in GameKitHelper aufgerufen wird:
func matchmakerViewController(viewController: GKMatchmakerViewController, didFindMatch match: GKMatch) {
viewcontroller.dismissViewControllerAnimated(true, completion: {})
self.match = match
match.delegate = self
}
Nun, ich denke, das sagt, dass die GKMatchmakerViewController entlassen wird, wodurch mir die erste Ansicht Steuerung zeigt wieder (und das ist, was auf dem Bildschirm passiert).
Jetzt mein Problem! Nachdem der GKMatchmakerViewController beendet ist, bin ich wieder am ersten View-Controller und möchte einen automatischen Übergang zu meinem gameView "simulieren" (der Logik hat, um auch mit einem Multi-Player-Spiel umzugehen).
ich die anfänglichen View-Controller vorgenommen habe entsprechen das MultiPlayerNetworking-Protokoll, das eine Funktion einen Übergang zu simulieren hat:
func segueToGVC() {
self.performSegueWithIdentifier("game", sender: nil) // self = initial view controller
}
jedoch xCode klagt mit:
Warning: Attempt to present <GameViewController: 0x7d440050> on <GKMatchmakerViewController: 0x7c8fbc00> whose view is not in the window hierarchy!
Ich bin steckte hier, und habe so viele verschiedene Methoden versucht, den View-Controller zu verwerfen, um sicherzustellen, dass ich die performSegue-Funktion auf dem topViewController über this link aufruft, aber nichts funktioniert.
Meine Frage: Warum ist der GKMatchmakerViewController visuell ausgeblendet, aber immer noch in der Ansichtshierarchie vorhanden, so dass der Aufruf einer performSegue-Funktion auf dem ursprünglichen View-Controller den obigen Fehler/die obige Warnung ergibt?
Ansichten werden sehr geschätzt!
Thans matt. Auf die Selbstfrage: Wenn ich in meiner Klasse anfängliche View-Controller bin und ich in einer Funktion innerhalb des View-Controllers bin, kann sich eigentlich nichts anderes ergeben? Wenn die Antwort ja ist, muss ich wirklich über diese Dinge nachdenken und/oder mein aktuelles Denken ändern. –
Wie kann ich sicherstellen, dass die Diskussion beendet wird, bevor ich versuche, einen weiteren Abschnitt zu machen? –
Nun, ich weiß nicht, wo Sie 'segueToGVC' nennen. Aber um eine Entlassung mit einer neuen Präsentation zu verfolgen, würden Sie die Präsentation ab der "Beendigung" der Entlassung durchführen wollen. Das ist, was completion_means_. – matt