2016-03-20 12 views
0

私は作業中のシンプルなシングルプレイヤーゲームを持っています。このボタンはセグを実行し、GameViewController内のすべてのゲームロジックが期待どおりに動作しています。警告:ビューがウィンドウ階層内にないビューを別のビューコントローラに表示しようとしました

私はthis tutorialに続き、自分のゲームにマルチプレーヤー機能を追加しました。

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

クラスMultiPlayerNetworkingがGameKitHelperプロトコルを実装し、matchStarted関数に呼び出される:初期ビューコントローラで 、ボタンがGameKitHelper.swiftに次の実装を有する

GameKitHelper.sharedGameKitHelper.findMatchWithMinPlayers(2, maxPlayers: 2, viewController: self, delegate: MultiPlayerNetworking) 
      } 

を呼び出し。 ここでは、MultiPlayerNetworkingクラスが引き継ぎ、ホストやリモートプレーヤーにメッセージを送信し始めます。オートマッチング仕上げは、以下の機能がGameKitHelperに呼び出さ

注いくつかの時間後のこと、:今すぐ

func matchmakerViewController(viewController: GKMatchmakerViewController, didFindMatch match: GKMatch) { 


    viewcontroller.dismissViewControllerAnimated(true, completion: {}) 

    self.match = match 
    match.delegate = self 

} 

、私はそれによって私の最初のビューコントローラを示し、これはGKMatchmakerViewControllerが却下されていることを言うと思いますもう一度(これは画面上で起こることです)。

今問題! GKMatchmakerViewControllerが終了した後、私は最初のビューコントローラーに戻って、自分のgameView(マルチプレーヤーゲームにも対応するロジックを持っている)に自動セグを「シミュレート」したいと思っています。

私は最初のビューコントローラがセグエをシミュレートする機能を有するMultiPlayerNetworkingプロトコルに準拠作った

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

しかし、Xcodeのは、と文句を言う:

Warning: Attempt to present <GameViewController: 0x7d440050> on <GKMatchmakerViewController: 0x7c8fbc00> whose view is not in the window hierarchy! 

私はここで立ち往生し、viewControllerのperformSegue関数をthis link経由で呼び出していることを確認するために、View Controllerを無効にするさまざまな方法を試しましたが、何も機能しません。

私の質問:なぜGKMatchmakerViewControllerは視覚的に却下されますが、最初のビューコントローラでperformSegue関数を呼び出すと上記のエラー/警告が表示されるようなビュー階層にも存在しますか?

ご意見をいただきありがとうございます。

答えて

1

ここGKMatchmakerViewController視覚的に退けたが、

ビュー階層になお存在している理由2件の提案があります:解雇は時間がかかるため

  • は、おそらくそれです。あなたは言っている:

    viewcontroller.dismissViewControllerAnimated(true, completion: {}) 
    

    アニメーションがあります。アニメーションが終了するまで、次のセグを実行しないでください。

  • おそらくあなたは誰のためにちょうど間違っていますselfです。あなたは言っている:selfが誰であるかのため

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

    私たちは、そのコメントで、あなただけの言葉を持っています。一方、ランタイムは、問題について違ったと考えているようだ:ランタイムを信じることは良いかもしれません<GKMatchmakerViewController: 0x7c8fbc00>

    <GameViewController: 0x7d440050>を提示する

    試み。結局のところ、それはあなたよりも多くを知っています。

+0

Thans matt。自己質問では:私はクラスの初期ビューコントローラにあり、私はビューコントローラ内の関数にある場合、自己本当に何か異なることができますか?答えが "はい"の場合、私はこの物を読んで、現在の考え方を変える必要があります。 –

+0

時間を忘れると、別のセグを実行しようとする前にディスカッションが完了していることを確認するにはどうすればよいですか? –

+0

まあ、私は 'segueToGVC'をどこで呼んでいるのか分かりません。しかし、新しいプレゼンテーションでの解雇には、解雇の「完了」からプレゼンテーションをしたいと思うでしょう。それが補完的なものです。 – matt

関連する問題