1

我有一个简单的单人游戏,其中初始视图控制器有一个按钮来启动游戏。此按钮执行 segue,GameViewController 中的所有游戏逻辑都按预期工作。

我已经按照本教程为我的游戏添加了多人游戏功能。在初始视图控制器上,一个按钮现在调用

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

在 GameKitHelper.swift 中有以下实现:

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 函数上被调用。MultiPlayerNetworking 类实质上接管了这里,并开始向主机和远程玩家发送消息。

请注意,一段时间后,当自动匹配完成时,GameKitHelper 中会调用以下函数:

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


    viewcontroller.dismissViewControllerAnimated(true, completion: {})

    self.match = match
    match.delegate = self

}

现在,我认为这表示 GKMatchmakerViewController 已被解除,从而再次向我显示初始视图控制器(这就是屏幕上发生的情况)。

现在我的问题!在 GKMatchmakerViewController 被解散后,我回到了初始视图控制器并想要“模拟”我的 gameView 的自动 segue(它也具有处理多人游戏的逻辑)。

我已经使初始视图控制器符合 MultiPlayerNetworking 协议,该协议具有模拟 segue 的功能:

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!

我被困在这里,并尝试了很多不同的方法来关闭视图控制器,以确保我通过此链接调用 topViewController 上的 performSegue 函数,但没有任何效果。

我的问题:为什么 GKMatchmakerViewController 在视觉上消失了,但仍然存在于视图层次结构中,这样在初始视图控制器上调用 performSegue 函数会给出上述错误/警告?

意见不胜感激!

4

1 回答 1

1

为什么 GKMatchmakerViewController 在视觉上消失了,但仍然存在于视图层次结构中

这里有两个建议:

  • 也许是因为解雇需要时间。你是说:

    viewcontroller.dismissViewControllerAnimated(true, completion: {})
    

    于是就有了动画。在动画结束之前不要尝试执行下一个 segue。

  • 也许你对谁self是错误的。你是说:

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

    我们只有你的话,在那条评论中,谁self是。同时,运行时似乎对此事有不同的看法:

    尝试<GameViewController: 0x7d440050><GKMatchmakerViewController: 0x7c8fbc00>

    相信运行时可能会很好;毕竟,它比你知道的多。

于 2016-03-20T17:55:37.760 回答