在main.m中设置UITapGestureRecognizer委托运行时错误时

时间:2014-04-28 04:49:53

标签: ios objective-c cocos2d-iphone delegates spritebuilder

这个问题让我很沮丧了好几个小时。我基本上有一个游戏,我需要使用UITapGestureRecognizer,但如果屏幕上有CCButton,这个点按手势会覆盖按钮上的点击。为了解决这个问题,我在代码-(BOOL)gestureRecognizer中实现了下面列出的方法。为了识别这一点,我必须将UITapGestureRecognizer的委托设置为self(至少据我所知)。

我的按钮可以正常工作,没有错误。在没有声明UITapGestureRecognizer的代表的情况下,水龙头被完美记录,一切正常,没有错误(我只能点击CCButton然后)。当我一起实现这一切并设置委托并执行以下操作时,我得到了一个错误。我输入我的LevelScene,点击我的mainMenu按钮,将我带回主菜单,然后再次单击我的播放按钮,然后我的应用程序崩溃线程1:EXC_BAD_ACCESS(代码= 1,地址= 0xe000000c )在我的main.m文件中。

我不确定为什么会这样,而且我还在使用Spritebuilder,但我不确定这是否会影响任何事情。以下是相关代码(我的Grid通过Spritebuilder添加到我的LevelScene。对不起,代码很长,但我认为这一切都是必要的。

的main.m

#import <UIKit/UIKit.h>

int main(int argc, char *argv[]) {

    @autoreleasepool {
        //error occurs right below this line
        int retVal = UIApplicationMain(argc, argv, nil, @"AppController");
        return retVal;
    }
}

LevelScene.m

@implementation LevelScene {
    Grid *_grid;
}

- (void)mainMenuFromLevelScene {
    [[LevelManager sharedInstance] reset];
    CCScene *levelScene = [CCBReader loadAsScene:@"MainScene"];
    [[CCDirector sharedDirector] replaceScene:levelScene];
}


@end

Grid.m

@implementation Grid

- (void)didLoadFromCCB {
    UITapGestureRecognizer * gridTapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gridTapped)];
    [[[CCDirector sharedDirector] view] addGestureRecognizer:gridTapped];
    gridTapped.delegate = self;
}

- (void)gridTapped {
    //correctly logs Grid tapped when screen is tapped
    CCLOG(@"Grid tapped");
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    //everything works correctly here too
    CGPoint touchLocation = [touch locationInNode:self];    
    if ((touchLocation.y < 0 || levelWonBool)) {
        CCLOG(@"returning no");
        return NO;
    }
    return YES;
}

Grid.h

#import "CCNodeColor.h"

@interface Grid : CCNodeColor <UIGestureRecognizerDelegate>

@end

0 个答案:

没有答案