2013-08-23 38 views
1

我有一个UIToolbar与一些UIBarButtonItems和一个UITableView包含一些UITextFields的视图。点击UIBarButtonItem不会被TapGestureRecognizer忽略

我想解除键盘的任何地方的水龙头的文本。因此我在视图中添加了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类]似乎不适用于工具栏上的所有水龙头。然而,使用isMemberOfClass:[UIToolbar类]检查超级视图是有效的。

我不明白这一点。也许有人可以解释这种行为?

回答

0

不应该依赖私有视图类的视图层次结构。它可以在任何时候改变。

更好的方法是将手势添加到表视图(或表示您感兴趣的区域的其他适当视图)。只要确保在适当的时候启用和禁用该手势,以免阻止通常的表操作。

+0

感谢您的提示,但它没有回答这个问题。使用NSLog语句,我可以看到UIToolbar位于水龙头位置的视图层次结构中。但isKindOfClass [UIToolbar类]返回NO。为什么? – Leontien

+0

超视图链条是多少工具栏视图? – Wain

+0

这是touch.view的超级视图:Touch.view.superview – Leontien