我正在运行 Xcode 4.3.3 并针对 iOS 5.1。我正在尝试在游戏中包含 Game Center 功能。
验证 GKLocalPlayer 时,会向用户显示登录到 Game Center警报视图或显示已登录。到目前为止这一切都很好,但如果用户按下创建新帐户按钮,那么任何打开的模式视图都会移到后面根视图控制器并从控制台吐出以下错误:
<GKModalRootViewController: memory address >开始/结束外观转换的不平衡调用。
我尝试在应用程序委托和根视图控制器之间移动 GKLocalPlayer 身份验证代码。我还尝试在一个新的空白项目中实现身份验证。我已经尝试过使用和不使用 Storyboards 和 ARC。在所有这些情况下,结果都是相同的:隐藏在根视图控制器后面的模式并给出错误。
这是我从应用程序委托的应用程序调用的 GKLocalPlayer 身份验证方法:didFinishLaunchingWithOptions:方法:
- (void)authenticateLocalPlayer
{
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
[localPlayer authenticateWithCompletionHandler:^(NSError *error) {
if (localPlayer.isAuthenticated) {
// Perform additional tasks for the authenticated player.
} else {
// Disable Game Center features.
}
if (error) {
// Handle error.
}
}];
}
这是它的屏幕截图。在这张图片中,根视图控制器的背景具有 50% 的 alpha 值。此错误已将模式推到根视图控制器后面。
这个stackoverflow问题包含我能找到的对这个错误的唯一引用(关于GKModalRootViewController),它不适合因为(a.)我没有使用cocos2d。(b.) 无论我是否执行 segue,都会发生这种情况,并且我没有触摸 viewWillAppear: 或 viewDidAppear:。(c.) 没有给出可接受的答案。
这个问题和这个问题似乎涉及相同的问题(视图层次结构被破坏),但没有得到解答,也没有提及控制台错误消息。
这会发生在其他人身上吗?关于可能导致这种情况的任何想法?
更新 1:我什至将身份验证代码放入连接到模式视图中按钮的 IBAction 中,以避免任何初始化冲突。它没有帮助。
更新 2:我尝试将身份验证代码移动到 GCD 后台队列中。他的结果是一样的。
这是测试项目(GameCenter 已经准备好我的应用程序的 Bundle ID)。
去测试:
- 在测试设备/模拟器上注销 Game Center(如果您已登录)。
- 构建并运行应用程序。
- 按信息按钮。
- 按验证。
- 当出现登录 Game Center 警报时,按Create New Account。
- 按取消。
- 控制台中是否出现“不平衡呼叫...”消息?模态视图(带有验证按钮)是否消失了?
- 按信息按钮。
- 模态再次显示了吗?