You need to enable JavaScript to run this app. iOS Swift开发:Game Center点击关闭按钮无法正常dismiss问题求助
优惠活动
大模型
产品
解决方案
定价
更多

iOS Swift开发:Game Center点击关闭按钮无法正常dismiss问题求助

Game Center关闭按钮无回调问题排查方案

最高概率触发原因

你实现的代理方法缺少@objc修饰符,GKGameCenterControllerDelegate是Objective-C原生协议,Swift实现其方法时如果不加@objc,runtime层无法识别到方法实现,会直接导致回调不触发。

修正步骤

  • 第一步:给代理方法添加@objc修饰符
    修改后的代理方法代码如下:
@objc func gameCenterViewControllerDidFinish(_ gameCenterViewController: GKGameCenterViewController) {
    gameCenterViewController.dismiss(animated: true, completion: nil)
    print("clicked")
}
  • 第二步:将GKGameCenterViewController实例改为类属性,避免局部变量提前被ARC释放
    在MainMenu类的属性声明部分添加全局gc属性:
var gc: GKGameCenterViewController?

对应修改showLeaderboard方法的实现:

func showLeaderboard(){
    guard let vc = self.view?.window?.rootViewController else { return }
    // 改为类属性存储实例,防止提前释放
    self.gc = GKGameCenterViewController()
    self.gc?.gameCenterDelegate = self
    self.gc?.viewState = .leaderboards
    self.gc?.leaderboardIdentifier = "superbounceleaderboard"
    vc.present(self.gc!, animated: true, completion: nil)
}
  • 第三步:校验项目基础配置
    打开Xcode项目的Signing & Capabilities标签,确认已经添加Game Center能力,同时当前使用的Bundle ID与App Store Connect中配置的游戏Bundle ID完全一致。

补充校验项

如果以上修改后仍无回调,可以做如下排查:

  • 在gc.gameCenterDelegate = self代码后添加打印print(gc.gameCenterDelegate),确认输出不为nil,代表代理赋值成功
  • 如果你的App存在多层控制器弹出场景,不要用rootViewController作为present的主体,改为获取当前最顶层的控制器来present,避免控制器层级异常导致回调失效

内容的提问来源于stack exchange,提问作者Chad Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 11:45:06