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的另外一件事: 不要直接实现GKChallengeListener
, GKInviteEventListener
, GKSavedGameListener
和GKTurnBasedEventListener
; 改为实现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
不能在模拟器上工作。