2016-03-20 4 views
0

У меня есть простая простая однопользовательская игра, в которой у начального контроллера есть кнопка для запуска игры. Эта кнопка выполняет 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 на первом контроллере представления дает вышеприведенную ошибку/предупреждение?

Мнения приветствуются!

ответ

1

почему это GKMatchmakerViewController визуально распущен, но по-прежнему присутствует в иерархии представлений

Вот два предложения:

  • Возможно, это потому, что увольнение занимает время. Вы говорите:

    viewcontroller.dismissViewControllerAnimated(true, completion: {}) 
    

    Итак, есть анимация. Не пытайтесь выполнить следующий сеанс, пока анимация не закончится.

  • Возможно, вы ошибаетесь, кто из self есть. Вы говорите:

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

    У нас есть только ваше слово, в том комментарии, для тех, кто self есть. Между тем, во время выполнения, кажется, по-другому думать о материи:

    Попытка представить <GameViewController: 0x7d440050> на <GKMatchmakerViewController: 0x7c8fbc00>

    Это может быть хорошо, чтобы верить выполнения; в конце концов, он знает больше, чем вы.

+0

Thans matt. На вопрос о себе: если я нахожусь в контроллере исходного класса и у меня есть функция в контроллере представления, может ли я действительно быть чем-то другим? Если да, то мне действительно нужно прочитать этот материал и/или изменить свое текущее мышление. –

+0

Устраняя время, как я могу убедиться, что обсуждение сделано до того, как я попытаюсь выполнить другой сеанс? –

+0

Ну, я не знаю, где вы называете 'segueToGVC'. Но чтобы после увольнения с новой презентацией вы хотели бы сделать презентацию, начиная с «завершения» увольнения. Это то, что завершение _means_. – matt

Смежные вопросы

 Смежные вопросы