いくつかのUIBarButtonItemsを持つUIToolbarといくつかのUITextFieldsを含むUITableViewを持つビューがあります。
どこでもタップしてテキストフィールドのキーボードを閉じたいと思います。したがって、TapGestureRecognizer をビューに追加しました。TapgestureRecognizer が UIBarButtonItems のタップを処理しないようにするために、次のメソッドを追加しました (デリゲートが設定されています)。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
UIView *view = touch.view;
while (view) {
NSLog(@"Class of view: %@", NSStringFromClass([view class]));
view = view.superview;
}
// Disallow recognition of tap gestures in the toolbar
if ([touch.view isKindOfClass:[UIToolbar class]]) {
return NO;
}
if ([touch.view.superview isMemberOfClass:[UIToolbar class]]) {
return NO;
}
return YES;
}
UIBarButtonItem はビュー自体ではありませんが、スーパービューとして UIToolbar を持っています。上記の方法を使用すると、ツールバーのすべてのタップに対して isKindOfClass:[UIToolbar class] のチェックが機能しないようです。ただし、 isMemberOfClass:[UIToolbar class] を使用したスーパービューのチェックは機能します。
私はこれを理解していません。多分誰かがこの振る舞いを説明できますか?