2012-11-07 8 views
13

staram się ignorować UITapGestureRecognizer krany na UITableView z następujących czynności:shouldReceiveTouch na UITableViewCellContentView

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
     if ([touch.view isKindOfClass:[UITableViewCellContentView class]]) { 
      return NO; // ignore the touch 
     } 
     return YES; // handle the touch 
} 

To nie będzie kompilacji: „Użyj identyfikatora nierejestrowanej 'UITableViewCellContentView'

nieudokumentowanych klasy Need ?. podklasy lepsza droga do osiągnięcia tego

Dzięki za wszelką pomoc

Odpowiedz

39

wydaje się to zrobić:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    if([touch.view isKindOfClass:[UITableViewCell class]]) { 
     return NO; 
    } 
    // UITableViewCellContentView => UITableViewCell 
    if([touch.view.superview isKindOfClass:[UITableViewCell class]]) { 
     return NO; 
    } 
    // UITableViewCellContentView => UITableViewCellScrollView => UITableViewCell 
    if([touch.view.superview.superview isKindOfClass:[UITableViewCell class]]) { 
     return NO; 
    } 
    return YES; // handle the touch 
} 
+1

ta jest podzielona w ios7. touch.view.superView == UITableViewCellScrollView – Legolas

+1

Jak wspomniano przez Legolasa, łamany na iOS7. W miarę zmiany hierarchii wymagane jest czwarte sprawdzenie. .superview.superview.superview musi być również sprawdzony! –

+2

złapię go na '' touch.view.superview.superview' na iOS ver 7.0' => The 3rd czeku ** ** ... –

4

Właśnie natknąłem się na ten problem, i następujące rozwiązanie działa na wszystkich wersjach iOS, bez ryzyka Apple zmienia hierarchię Widok na Tableview. Zasadniczo zachowaj odwołanie do swojego UITableView:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
     if([touch.view isDescendantOfView:detailsTableView]) { 
      return NO; 
     } 
     return YES; 
    } 

//isDescendantOfView:YES if the receiver is an immediate or distant subview of view or if view is the receiver itself; otherwise NO. 
+0

Dzięki za to rozwiązanie. W iOS8 zmienili oni ponownie hierarchię widoków UITableView. – masam

10

Możesz to zrobić.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
    { 
     if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) { 
      return NO; 
     }else{ 
      return YES; 
     } 
    } 
+0

Jest to uroczy sposób i na pewno zasługuje na więcej się głosy. –

+0

Bardzo ładny, byłoby miło wiedzieć więcej na ten temat – vib

2

Oto szybkie rozwiązanie dla wybranej odpowiedzi.

nie mogę użyć „MyTableView nazwie” check zależność bo miałem zwyczaj BaseViewController że wiele kontrolerów widoku czerpać z. Niektóre takie kontrolery mają tableview, niektóre mają widok zbiórki lub obu, ale w każdym przypadku rozpoznawania gest kradnie ich dotyka.

Nie chciałem umieścić ten gest kod obsługi w każdej podklasy, więc jedynym sposobem mam go pracujących w klasie bazowej jest taka:

extension BaseViewController: UIGestureRecognizerDelegate { 

    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { 
     var view = touch.view 
     while view != nil { 
      if view!.isKindOfClass(UICollectionView) || view!.isKindOfClass(UITableView) { 
       return false 
      } else { 
       view = view!.superview 
      } 
     } 
     return true 
    } 

} 
Powiązane problemy