この問題は、かなりの時間私を苛立たせてきました。私は基本的に を使用する必要があるゲームを持っていますUITapGestureRecognizer
が、画面に CCButton がある場合、このタップ ジェスチャはボタンのタップをオーバーライドします。この問題を回避するために、以下にリストされているメソッドをコードに実装します-(BOOL)gestureRecognizer
。これが認識されるようにするには、UITapGestureRecognizer
のデリゲートをself
(少なくとも私の知る限り) に設定する必要があります。
私のボタンは単独で問題なく動作し、バグはありません。のデリゲートを宣言しなくてもUITapGestureRecognizer
、タップは完全に記録され、すべてが機能し、バグはありません (CCButton をクリックすることはできません)。これをまとめて実装し、デリゲートを設定して次のことを行うと、バグが発生します。my に入り、LevelScene
mainMenu ボタンをタップしてメイン メニューに戻り、再生ボタンをもう一度クリックすると、アプリがスレッド 1: EXC_BAD_ACCESS (code = 1, address = 0xe000000c)でクラッシュしmain.m
ます。
なぜこれが起こっているのかわかりません。また、Spritebuilder を使用していますが、それが何かに影響するかどうかはわかりません。以下は関連するコードです (myはSpritebuilder を介しGrid
て my に追加されます)。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