0

私の didFinishLaunchingWithOptions メソッドで、GLKView と UIButton をサブビューとして作成します。私のコード:

    EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    [EAGLContext setCurrentContext:context];

    view = [[GLKView alloc] initWithFrame:[[UIScreen mainScreen] bounds] context:context];
    view.delegate = self;

    btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [btn setFrame:CGRectMake(5, 50, 200, 50)];
    [btn setTitle:@"Run animation" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(buttonClickHandler:) forControlEvents:UIControlEventTouchUpInside];
    [view addSubview:btn];

    controller = [[GLKViewController alloc] init];
    controller.delegate = self;
    controller.view = view;

    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapHandler:shouldReceiveTouch:)];
    tapRecognizer.delegate = self;
    [view addGestureRecognizer:tapRecognizer];

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = glController;
    [self.window makeKeyAndVisible];

viewcontroller、私のクラスbtnのメンバー変数です。AppDelegate

tapHandler:shouldReceiveTouch:ボタンのタップを処理したくないのでセレクターを使用するので、これを行います:

- (BOOL) tapHandler:(UIGestureRecognizer *)recognizer shouldReceiveTouch:(UITouch *)touch
{
    if ([touch.view isKindOfClass:[UIButton class]])
        return NO;
    else
    {
        // some logic ...

        return YES;
    }
}

問題は、取得した touch.view プロパティを読み込もうとしたときですEXC_BAD_ACCESS。その理由と回避方法を教えてください。

4

1 に答える 1

2

ジェスチャ レコグナイザー ターゲットのシグネチャが間違っています。UIButton ターゲットと同じ形式にする必要があります。つまり、引数を 1 つだけ持つ必要があります。このメソッドは、タップ ジェスチャが認識されると呼び出されます。

メソッドtapHandler:shouldReceiveTouch:は、ジェスチャ認識デリゲートに属しています。

編集: ボタンについて心配しないでください。ボタンが押されてもタップは認識されないため、このデリゲート メソッドは必要ありません。

于 2013-02-02T09:21:46.670 に答える