新的视图控制器出现然后消失在 CCScene 后面

Posted

技术标签:

【中文标题】新的视图控制器出现然后消失在 CCScene 后面【英文标题】:New view controller appears and then disappears behind CCScene 【发布时间】:2011-02-08 23:56:20 【问题描述】:

我正在使用this tutorial 将Ben Gottlieb's Twitter-OAuth-iPhone 代码集成到我的cocos2d 0.99.5 项目中。我在让视图控制器正确加载时遇到了一些困难。我以前从未将 cocos2d 与标准的 Cocoa Touch UI 混合过,而且我有点不知所措。

当需要连接到 Twitter 时,我在我的应用委托中调用以下代码:

-(void) twitterAccountLogin

    UIViewController *controller = nil;
    if (!_engine) 
        _engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self];
        _engine.consumerKey = kOAuthConsumerKey;
        _engine.consumerSecret = kOAuthConsumerSecret;

        controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self];
    

    if (controller) 
        [[CCDirector sharedDirector] stopAnimation];
        [viewController presentModalViewController:controller animated:YES];
        [controller release];
        return;
    
 

当它被调用时,Twitter UIViewController 被创建,它在屏幕上动画,然后,一旦它完成动画(即它到达屏幕顶部),它就会消失。当前运行的CCScene 重新出现,但它不响应触摸。在模拟器上,不是重新出现正在运行的场景,而是屏幕变黑。如果不清楚,viewController 是最近在 0.99.5 中添加到 cocos2d 中的RootViewController

在我看来,UIViewController 正在创建,然后以某种方式绘制在运行场景下,但调试让我无处可去。我哪里出错了?

【问题讨论】:

【参考方案1】:

你的视图控制器应该是这样的:

[[[CCDirector sharedDirector]openGLView] addSubview: viewController.view]; 
[viewController presentModalViewController: controller animated:YES];

【讨论】:

我应该澄清 viewController 是项目的 RootViewController ——将其视图作为子视图添加到 CCDirector 会创建一个导致应用程序崩溃的无限循环。现在已对问题进行了编辑以进行澄清。不过,我感谢您的帮助! 如果你声明你的 viewController 为: viewController = [[UIViewController alloc] initWithNibName:nil bundle:nil];我认为会工作..【参考方案2】:

在这里和 cocos2d 论坛上寻求帮助后,这就是我最终做的事情。

-(void)pauseMenuButtonPressed
    
    if(!paused)
    
        paused = TRUE;

        [[CCDirector sharedDirector] pause];

        CGSize s = [[CCDirector sharedDirector] winSize];
        pauseLayer = [CCColorLayer layerWithColor: ccc4(150, 150, 150, 125) width: s.width height: s.height];
        pauseLayer.position = CGPointZero;
        [self addChild: pauseLayer z:8];

        CCMenuItem *pauseMenuItemResume =[CCMenuItemImage itemFromNormalImage:@"menuItemResumeSmall.png"
                                                            selectedImage: @"menuItemResumeSmallSelected.png"
                                                                   target:self
                                                                 selector:@selector(pauseMenuResumeSelected)];


        CCMenuItem *pauseMenuItemMainMenu =[CCMenuItemImage itemFromNormalImage:@"menuItemMainMenuSmall.png"
                                                              selectedImage: @"menuItemMainMenuSmallSelected.png"
                                                                     target:self
                                                                   selector:@selector(pauseMenuExitToMainMenuSelected)];

        // Create the pause menu and add the menu items to it
        pauseMenu = [CCMenu menuWithItems:pauseMenuItemResume, pauseMenuItemMainMenu, nil];

        // Arrange the menu items vertically
        [pauseMenu alignItemsVertically];

        // add the menu to the scene
        [self addChild:pauseMenu z:10];

        [hudButtons setIsTouchEnabled:NO];
    


简而言之,我没有为暂停菜单推送新场景,而是暂停游戏中的所有动作,创建一个透明层覆盖屏幕,然后在其上显示菜单。这似乎是 cocos2d 中处理此问题的常规方法,至少在 0.99.5 中(这是游戏当前运行的版本)。

【讨论】:

以上是关于新的视图控制器出现然后消失在 CCScene 后面的主要内容,如果未能解决你的问题,请参考以下文章

应用启动后,渐变出现在导航栏后面

登录屏幕消失并在登录失败时重新出现

在 iOS 6 上显示的视图消失了。我该如何解决?

UINavCtrlr 推送动画将内容部分移开然后消失

视图可以在用户触摸屏幕的位置出现,然后消失吗?

Xcode 启动屏幕上的图像视图出现片刻然后消失