警告:尝试在视图不在 window 层次结构中的另一个视图控制器上呈现视图控制器
Warning: Attempt to present view controller on another view controller whose view is not in the window hierarchy
我有一个工作简单的单人游戏,其中初始视图控制器有一个按钮来开始游戏。此按钮执行转场,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()
}
ClassMultiPlayerNetworking 实现了 GameKitHelper 协议,并在 matchStarted 函数上被调用。
MultiPlayerNetworking class 本质上接管了这里,并开始向主机和远程玩家发送消息。
请注意,一段时间后,当自动匹配完成时,GameKitHelper 中将调用以下函数:
func matchmakerViewController(viewController: GKMatchmakerViewController, didFindMatch match: GKMatch) {
viewcontroller.dismissViewControllerAnimated(true, completion: {})
self.match = match
match.delegate = self
}
现在,我认为这表明 GKMatchmakerViewController 已被关闭,从而再次向我显示初始视图控制器(这就是屏幕上发生的情况)。
现在是我的问题!在关闭 GKMatchmakerViewController 后,我回到了初始视图控制器并希望 'simulate' 自动转入我的 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 函数会给出上述 error/warning?
不胜感激!
why is the GKMatchmakerViewController visually dismissed, but still present in the view hierarchy
这里有两个建议:
可能是因为解雇需要时间。你是说:
viewcontroller.dismissViewControllerAnimated(true, completion: {})
所以有一个动画。在动画结束之前不要尝试执行下一个 segue。
也许你只是误会了 self
是谁。你是说:
self.performSegueWithIdentifier("game", sender: nil)
// self = initial view controller
关于 self
是谁,我们只有您在那条评论中所说的话。同时,运行时似乎对此事有不同的看法:
Attempt to present <GameViewController: 0x7d440050>
on <GKMatchmakerViewController: 0x7c8fbc00>
相信运行时可能会很好;毕竟,它比你知道的更多。
我有一个工作简单的单人游戏,其中初始视图控制器有一个按钮来开始游戏。此按钮执行转场,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()
}
ClassMultiPlayerNetworking 实现了 GameKitHelper 协议,并在 matchStarted 函数上被调用。 MultiPlayerNetworking class 本质上接管了这里,并开始向主机和远程玩家发送消息。
请注意,一段时间后,当自动匹配完成时,GameKitHelper 中将调用以下函数:
func matchmakerViewController(viewController: GKMatchmakerViewController, didFindMatch match: GKMatch) {
viewcontroller.dismissViewControllerAnimated(true, completion: {})
self.match = match
match.delegate = self
}
现在,我认为这表明 GKMatchmakerViewController 已被关闭,从而再次向我显示初始视图控制器(这就是屏幕上发生的情况)。
现在是我的问题!在关闭 GKMatchmakerViewController 后,我回到了初始视图控制器并希望 'simulate' 自动转入我的 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 函数会给出上述 error/warning?
不胜感激!
why is the GKMatchmakerViewController visually dismissed, but still present in the view hierarchy
这里有两个建议:
可能是因为解雇需要时间。你是说:
viewcontroller.dismissViewControllerAnimated(true, completion: {})
所以有一个动画。在动画结束之前不要尝试执行下一个 segue。
也许你只是误会了
self
是谁。你是说:self.performSegueWithIdentifier("game", sender: nil) // self = initial view controller
关于
self
是谁,我们只有您在那条评论中所说的话。同时,运行时似乎对此事有不同的看法:Attempt to present
<GameViewController: 0x7d440050>
on<GKMatchmakerViewController: 0x7c8fbc00>
相信运行时可能会很好;毕竟,它比你知道的更多。