我有一个iOS应用程序,我刚刚开始实现游戏中心支持。我在loadView期间为我的主(根)视图控制器调用authenticateWithCompletionHandler方法。我的主视图显示,不久之后,“登录游戏中心”对话框将完全按预期显示。如果选择“创建新帐户”,游戏中心“新帐户”弹出对话框将显示在屏幕中间(这是在iPad上) - 但我的基础主菜单消失。弹出式对话框下面只是一个黑屏。如果我在完成处理程序中关闭对话框,它会按预期消失,我的主菜单会回来。
我认为这必须是某种视图层次结构问题,因此为了尝试简化问题,我创建了一个新项目。使用Xcode 4.3.2我通过添加单个视图控制器类“AppViewController”修改了一个新的“空应用程序”iOS项目。我更改了系统创建的AppDelegate.m文件applicationDidFinishLaunchingWithOptions方法来设置rootViewController(在窗口背景颜色设置为白色之后):
self.window.rootViewController =
[[[AppViewController alloc] initWithNibName:nil bundle:nil] autorelease];
...我设置了AppViewController的loadView方法来加载带有彩色背景的视图(所以我可以判断它是否在它上面正确合成)然后调用gamekit认证方法:
- (void) loadView {
self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
self.view.backgroundColor = [UIColor yellowColor];
GKLocalPlayer * localPlayer = [GKLocalPlayer localPlayer];
[localPlayer authenticateWithCompletionHandler:nil];
}
这个简单的结构完全模仿了我的视图层次结构设置 - 一个UIViewController设置为窗口rootViewController,它加载和管理视图层次结构。没有XIB文件。
无论如何,我使用这个非常简单的测试应用程序获得完全相同的行为。当出现“新帐户”弹出对话框时,我的基础视图(在本例中为黄色填充)消失(并显示基础窗口白色填充)。我认为这与我对iOS如何要我管理这些控制器和视图的误解有关。
然而,特别奇怪的是(至少对我而言)是我要么取消“新帐户”窗口还是使用现有帐户登录,然后立即打开成就弹出对话框(使用presentModalViewController) , 这样可行!我可以在成就对话框后面看到我的主菜单视图。向视图添加一个简单的按钮,向视图控制器按下按钮处理器显示相同的事情 - 成就对话框显示背景视图很好,但“新帐户”对话框模糊了底层视图。显然,我希望“新帐户”对话框看起来像浮动在我的基础视图之上。我应该提一下我在iOS 5.1上测试。
感谢您提供给我的任何帮助!
更新:在接受另一个stackoverflow帖子的建议后,我购买了Jeff LaMarche,David Mark和Jack Nutting的“开始iOS 5开发”,并回顾了关于从Xcode开始的部分“空应用程序“模板。这导致我稍微修改我的测试代码。 相反直接设置“rootViewController”属性,我现在在applicationDidFinishLaunchingWithOptions中执行此操作:
UIViewController * viewController =
[[[AppViewController alloc] initWithNibName:nil bundle:nil] autorelease];
viewController.view.backgroundColor = [UIColor yellowColor];
[self.window addSubview:viewController.view];
我还在视图控制器上删除了上面的loadView方法。这有效!有谁知道为什么?我没有看到两个系统之间存在实质性差异。在第一个我想我是在视图控制器上重新创建视图(在第二个系统中的视图控制器视图上没有alloc / init);是否有一些关于自动创建的视图的特殊内容?
UPDATE x2 :好的,看起来真正的区别在于:
[self.window addSubview:viewController.view];
我认为在窗口上设置rootViewController会自动将视图添加到窗口,但除非我明确地这样做,否则我会得到这种奇怪的行为。所以我找到了解决这个问题的方法,我只是不明白它为什么会起作用。有任何想法吗?谢谢!
答案 0 :(得分:0)
我不确定是什么导致了您的问题,但是一旦您的应用启动,通常会调用authenticateWithCompletionHandler方法。尝试在appDelegate中的applicationDidFinishLaunchingWithOptions方法中移动它,看看它是否有效。