2012-11-07 4 views
13

sto cercando di ignorare UITapGestureRecognizer rubinetti su un UITableView con il seguente:shouldReceiveTouch su UITableViewCellContentView

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

Non compilerà:? "L'utilizzo di identificatore non dichiarato

classe Undocumented 'UITableViewCellContentView' bisogno ??. sottoclasse modo migliore per ottenere questo risultato

Grazie per qualsiasi aiuto

risposta

39

questo sembra farlo:

- (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

Questo è rotto in iOS7. touch.view.superView == UITableViewCellScrollView – Legolas

+1

Come menzionato da Legolas, Broken su iOS7. Come la gerarchia, modificata, è richiesto un quarto controllo. .superview.superview.superview deve anche essere controllato! –

+2

L'ho preso su 'touch.view.superview.superview' su' iOS ver 7.0' => Il ** 3 ° controllo ** ... –

4

Ho appena imbattuto in questo problema, e la seguente soluzione funziona su tutte le versioni di iOS, senza avere il rischio di Apple, cambiare la vista gerarchia della tableView. In pratica, mantieni un riferimento a 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

Grazie per questa soluzione. In iOS8 hanno cambiato nuovamente la gerarchia delle viste di UITableView. – masam

10

È possibile farlo.

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

Questo è un modo affascinante e certamente merita più voti. –

+0

Molto bello, sarebbe bello sapere di più su questo – vib

2

Ecco la soluzione rapida per la risposta selezionata.

Non è stato possibile utilizzare il controllo di dipendenza denominato "MyTableView" perché disponevo di un BaseViewController personalizzato da cui derivano molti controller di visualizzazione. Alcuni controller di vista hanno una vista tabella, alcuni hanno una vista raccolta o entrambi, ma in tutti i casi il riconoscitore di gesti ruba i loro tocchi.

Non volevo mettere questo codice di gestione in ogni sottoclasse gesto, quindi l'unico modo ho ottenuto che funziona nella classe base è questo:

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 
    } 

}