GKTurnBasedEventListener不能被设置为我的ViewController的委托?

在objC中, Rawendrich为GKTurnBasedEventListener编写的语法,当时是GKTurnBasedEventHandler ,现在由Apple改为如下。

  if (!gameCenterAvailable) return; void (^setGKEventHandlerDelegate)(NSError *) = ^ (NSError *error) { GKTurnBasedEventHandler *ev = [GKTurnBasedEventHandler sharedTurnBasedEventHandler]; ev.delegate = self; }; NSLog(@"Authenticating local user..."); if ([GKLocalPlayer localPlayer].authenticated == NO) { [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler: setGKEventHandlerDelegate]; } else { NSLog(@"Already authenticated!"); setGKEventHandlerDelegate(nil); } 

现在把这个转换成swift之后,写下GKTurnBasedEventListener而不是GKTurnBasedEventHandler ,这是以下方法。

 // Converted with Swiftify v1.0.6381 - https://objectivec2swift.com/ if !gameCenterAvailable { return } var setGKEventHandlerDelegate: ((_: Error) -> Void)? = {(_ error: Error?) -> Void in var ev = GKTurnBasedEventHandler.shared() ev.delegate = self } print("Authenticating local user...") if GKLocalPlayer.localPlayer().authenticated == false { GKLocalPlayer.localPlayer().authenticate(withCompletionHandler: setGKEventHandlerDelegate) } else { print("Already authenticated!") setGKEventHandlerDelegate(nil) } 

不幸的是,这不是为我的ViewController设置GKTurnBasedEventListener委托的正确语法。

如果有人能为我解决这个问题,因为没有这个我不能通过事件监听器的默认function。

干杯!

仅供参考,如果您想要在回合GameKit比赛期间使用GKLocalPlayerListener的实例,欢迎看看这个基于回合的游戏的示例项目 。 我希望看到上下文中的所有内容是很有帮助的。

最后经过十几个小时的艰苦,我从这里找出了这个问题。 尽pipe这个语法在objC中,但是从Swiftify转换为swift没有问题。

虽然比实时晚了一点,但是我现在能够明白,设置GKTunBasedEventListener委托并不像我们为UITableViewControllerDelegate所做的那样。

在这里,必须首先validation本地播放器,然后必须将本地播放器的监听器注册到ViewController的代理GKLocalPlayerListener。

我在Apple的文档中find的另外一件事: 不要直接实现GKChallengeListenerGKInviteEventListenerGKSavedGameListenerGKTurnBasedEventListener ; 改为实现GKLocalPlayerListener 您可以使用GKLocalPlayerListener侦听和处理多个事件。

那么我以下面的方式实现。

 import GameKit class ViewController: UIViewController, GKTurnBasedMatchmakerViewControllerDelegate, GKLocalPlayerListener { ..... func player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch, didBecomeActive: Bool) { print("#1") print(player) print("#2") print(match) print("#3") print(didBecomeActive) if match.status == GKTurnBasedMatchStatus.open { if GKLocalPlayer.localPlayer() == match.currentParticipant { if didBecomeActive { // Active now } else { // Active already } } else { // It's someone's turn if match.matchData != myMatch?.matchData { // Match Data being Updated by Someone print(player.alias ?? "No Name:") } } } thirdTopLabel.text = match.matchID! + "\n" + didBecomeActive.description } .... 

现在在ViewDidLoad()函数中放入下面的代码。

 // In the ViewDidLoad function if(!GKLocalPlayer.localPlayer().isAuthenticated) { authenticatePlayer { (auth) in weak var weakSelf = self weak var weakPlayer = GKLocalPlayer.localPlayer() if(auth){ weakPlayer?.register(weakSelf!) self.suthentication = true; } else{ print("failed in authentication") self.suthentication = false; } } } else { // Already Authenticated GKLocalPlayer.localPlayer().register(self) localPlayer = GKLocalPlayer.localPlayer() } 

最后你的authenticationfunction应该是这样的。

 // authenticate local player :: Just Authentication func authenticatePlayer(completionHandler: @escaping (_ resultedPlaces: Bool) -> Void) { localPlayer = GKLocalPlayer.localPlayer() localPlayer.authenticateHandler = { (viewController , error ) -> Void in if viewController != nil { self.present(viewController!, animated:true, completion: nil) } else { if self.localPlayer.isAuthenticated { completionHandler(true); } else { completionHandler(false); print("not able to authenticate fail") self.gameCenterEnabled = false if (error != nil) { print("\(error.debugDescription)") } else { print( "error is nil") } } } } } 

注意: GKLocalPlayerListener不能在模拟器上工作。