У меня есть простая простая однопользовательская игра, в которой у начального контроллера есть кнопка для запуска игры. Эта кнопка выполняет 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()
}
Класс MultiPlayerNetworking реализует протокол GameKitHelper, и вызывается на функцию matchStarted , Класс MultiPlayerNetworking по существу принимает на себя и начинает отправлять сообщения на хосты и удаленные игроки.
Обратите внимание, что через некоторое время, когда авто-согласования заканчивается, следующая функция вызывается в GameKitHelper:
func matchmakerViewController(viewController: GKMatchmakerViewController, didFindMatch match: GKMatch) {
viewcontroller.dismissViewControllerAnimated(true, completion: {})
self.match = match
match.delegate = self
}
Теперь, я думаю, что это говорит о том, что GKMatchmakerViewController уволен, тем самым показывая мне первоначальный контроллер представления снова (и это то, что происходит на экране).
Теперь мой вопрос! После того, как GKMatchmakerViewController уволен, я вернусь к начальному контроллеру представления и хочу «имитировать» автоматический переход к моему игровому представлению (у которого есть логика и для игры с несколькими игроками).
Я сделал первоначальный контроллер представления соответствуют протоколу 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!
Я застрял здесь и пробовал так много разных способов отклонения контроллера вида, чтобы убедиться, что я вызываю функцию performSegue на topViewController через this link, но ничего не работает.
Мой вопрос: почему GKMatchmakerViewController визуально отклонен, но все еще присутствует в иерархии представлений, так что вызов функции executeSegue на первом контроллере представления дает вышеприведенную ошибку/предупреждение?
Мнения приветствуются!
Thans matt. На вопрос о себе: если я нахожусь в контроллере исходного класса и у меня есть функция в контроллере представления, может ли я действительно быть чем-то другим? Если да, то мне действительно нужно прочитать этот материал и/или изменить свое текущее мышление. –
Устраняя время, как я могу убедиться, что обсуждение сделано до того, как я попытаюсь выполнить другой сеанс? –
Ну, я не знаю, где вы называете 'segueToGVC'. Но чтобы после увольнения с новой презентацией вы хотели бы сделать презентацию, начиная с «завершения» увольнения. Это то, что завершение _means_. – matt