2013-08-23 86 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