2012-11-07 30 views
13

मैं UITapGestureRecognizer निम्नलिखित के साथ एक UITableView पर टैप करता अनदेखी करने के लिए कोशिश कर रहा हूँ पर:shouldReceiveTouch UITableViewCellContentView

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

यह संकलन नहीं होगा? 'UITableViewCellContentView'

Undocumented वर्ग अघोषित पहचानकर्ता का प्रयोग "की आवश्यकता है ?। उपवर्ग के लिए बेहतर तरीका यह है,

धन्यवाद किसी भी मदद के लिए

उत्तर

39

यह यह करने के लिए लगता है:

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

यह iOS7 में टूट गया है। touch.view.superView == UITableViewCellScrollView – Legolas

+1

जैसा कि लीगोलस द्वारा उल्लेख किया गया है, आईओएस 7 पर टूटा हुआ है। पदानुक्रम के रूप में, बदल गया, चौथी जांच की आवश्यकता है। .superview.superview.superview भी जांच की जानी चाहिए! –

+2

मैं इसे 'आईओएस वर्क 7.0' => ** 3 चेक चेक ** पर 'touch.view.superview.superview' पर पकड़ता हूं। ** –

4

मैं सिर्फ इस समस्या भर में आया है, और निम्न समाधान सभी iOS संस्करण पर काम करता है, एप्पल tableView को देखते पदानुक्रम को बदलने के जोखिम के बिना। मूल रूप से, अपने 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

इस समाधान के लिए धन्यवाद। आईओएस 8 में उन्होंने UITableView के दृश्य पदानुक्रम को फिर से बदल दिया। – masam

10

आप यह कर सकते हैं।

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

यह एक आकर्षक तरीका है और निश्चित रूप से अधिक वोटों के लिए पात्र है। –

+0

बहुत अच्छा, इस बारे में और जानना अच्छा लगेगा – vib

2

यहां चयनित उत्तर के लिए त्वरित समाधान है।

मैं निर्भरता जांच नामक "MyTableView" का उपयोग नहीं कर सका क्योंकि मेरे पास कस्टम बेस व्यू कंट्रोलर था जो कई व्यू कंट्रोलर से निकला था। कुछ दृश्य नियंत्रकों के पास टेबलव्यू होता है, कुछ में संग्रह दृश्य होता है या दोनों ही होते हैं लेकिन सभी मामलों में इशारा पहचानकर्ता अपने स्पर्श चुरा लेता है।

मैं इस इशारा हर उपवर्ग में कोड से निपटने, तो एक ही रास्ता मैं आधार वर्ग में काम मिल गया डाल करने के लिए नहीं करना चाहता था यह है:

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 
    } 

}