私のView Controllerの次のコードは、EXC_BAD_ACCESS
at the touch.view
callになります。
- (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
}