2016-03-20 15 views
0

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!

Antwort

1

warum ist die GKMatchmakerViewController visuell entlassen, aber derzeit noch in der Ansichtshierarchie

Hier zwei Vorschläge sind:

  • Vielleicht ist es, weil die Entlassung Zeit nimmt. Sie sagen:

    viewcontroller.dismissViewControllerAnimated(true, completion: {}) 
    

    So gibt es eine Animation. Versuchen Sie nicht, den nächsten Abschnitt auszuführen, bis die Animation beendet ist.

  • Vielleicht irren Sie sich einfach darüber, wer self ist. Sie sagen:

    self.performSegueWithIdentifier("game", sender: nil) 
    // self = initial view controller 
    

    Wir haben nur dein Wort, in diesem Kommentar, für die self ist. Inzwischen scheint sich die Laufzeit anders über die Sache zu denken:

    Versuch <GameViewController: 0x7d440050> auf <GKMatchmakerViewController: 0x7c8fbc00>

    Es präsentieren könnte gut sein, die Laufzeit zu glauben; Schließlich weiß es mehr als du.

+0

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. –

+0

Wie kann ich sicherstellen, dass die Diskussion beendet wird, bevor ich versuche, einen weiteren Abschnitt zu machen? –

+0

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

Verwandte Themen