警告:尝试在视图不在窗口层次结构中的另一个视图控制器上显示视图控制器

时间:2016-03-20 17:40:40

标签: swift gamekit gkmatchmaker

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

我已跟随this tutorial向我的游戏添加多人游戏功能。 在初始视图控制器上,现在有一个按钮调用

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

Class 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(它具有处理多人游戏的逻辑)。

我已经让初始视图控制器符合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!

我被困在这里,并尝试了许多不同的方法来解除视图控制器,以确保我通过this link在topViewController上调用performSegue函数,但没有任何效果。

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

非常感谢观看次数!

1 个答案:

答案 0 :(得分:1)

  

为什么GKMatchmakerViewController在视觉上被解除,但仍然存在于视图层次结构中

以下是两条建议:

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

    1459

    所以有一个动画。在动画结束之前,请勿尝试执行下一个segue。

  • 也许你对viewcontroller.dismissViewControllerAnimated(true, completion: {}) 是谁是错的。你在说:

    self

    在该评论中,我们只有self.performSegueWithIdentifier("game", sender: nil) // self = initial view controller 是谁。与此同时,运行时似乎对此事有不同的看法:

      

    尝试在self

    上展示<GameViewController: 0x7d440050>

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