我有一个带有几个 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] 检查超级视图是有效的。
我不明白这一点。也许有人可以解释这种行为?