这个问题让我很沮丧了好几个小时。我基本上有一个游戏,我需要使用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