1

私のView Controllerの次のコードは、EXC_BAD_ACCESSat the touch.viewcallになります。

- (BOOL)handleSingleTap:(UITapGestureRecognizer *)recognizer shouldReceiveTouch:(UITouch *)touch {

    if ([touch.view isKindOfClass:[UIControl class]]) {   // <<<< EXC_BAD_ACCESS HERE
        // we touched a button, slider, or other UIControl
        return NO; // ignore the touch
    }
    [self.view endEditing:YES];  // dismiss the keyboard
    return YES; // handle the touch    
}

touchゾンビに見える。具体的にtouchは、アドレスに設定され、デバッガーはそれをUITouchポインターと見なしますが、プロパティはありません。

デバッガーで見られるように

これは、iOS 4.x では発生しませんでした。iOS 6 のバグなのか、それとも私のせいなのか?

ジェスチャ レコグナイザは次のように設定されます (ViewController 内)。

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:shouldReceiveTouch:)];
[tapRecognizer setDelegate:self];
[tapRecognizer setNumberOfTapsRequired:1];
[tapRecognizer setNumberOfTouchesRequired:1];
tapRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapRecognizer];
[tapRecognizer release];

更新/解決策:

私の側のユーザー エラーを指摘してくれた Rob に感謝します。それだけでなく、タッチが発生したことを知りたいだけなので、TapRecognizer は実際には必要ありません。

UIControl 以外の場所をタッチしてオンスクリーン キーボードを閉じる正しいコードは次のとおりです。

ViewController のviewDidLoad:

UIGestureRecognizer *myRecognizer = [[UIGestureRecognizer alloc] init];
[myRecognizer setDelegate:self];
myRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:myRecognizer];
[myRecognizer release];

と:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch  {

if ([touch.view isKindOfClass:[UIControl class]]) {
    // we touched a button, slider, or other UIControl
    return NO; // ignore the touch
}

[self.view endEditing:YES];  // dismiss the keyboard
return YES; // handle the touch    

}

4

1 に答える 1

2

handleSingleTap:shouldReceiveTouch:署名が許容される署名に準拠していないメソッド を使用しています。UIGestureRecognizer クラス リファレンスの概要セクションを参照してください。これには、ジェスチャー認識エンジンという 1 つのパラメーターのみが必要です。

UIGestureRecognizerDelegateハンドラーとプロトコル メソッドを混同している可能性がありますgestureRecognizer:shouldReceiveTouch:

于 2012-12-26T08:56:06.630 に答える