2012-11-07 12 views
13

Tôi đang cố gắng để bỏ qua UITapGestureRecognizer vòi trên một UITableView với những điều sau:shouldReceiveTouch trên UITableViewCellContentView

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

Nó sẽ không biên dịch: "Việc sử dụng định danh chưa được khai báo

lớp khống và 'UITableViewCellContentView' Cần ?. phân lớp cách tốt hơn để thực hiện điều này

Nhờ sự giúp đỡ

Trả lời

39

Điều này dường như làm điều đó:

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

này được chia trong iOS7. touch.view.superView == UITableViewCellScrollView – Legolas

+1

Như đã đề cập trong Legolas, Broken trên iOS7. Khi hệ thống phân cấp, thay đổi, yêu cầu kiểm tra thứ tư. .superview.superview.superview cũng phải được kiểm tra! –

+2

Tôi bắt nó trên 'touch.view.superview.superview' trên' iOS ver 7.0' => ** Kiểm tra thứ 3 ** ... –

4

Tôi vừa gặp vấn đề này và giải pháp sau đây hoạt động trên tất cả các phiên bản iOS, mà không gặp rủi ro khi Apple thay đổi thứ bậc chế độ xem của tableView. Cơ bản, giữ tham chiếu đến UITableView của bạn:

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

Cảm ơn giải pháp này. Trong iOS8, họ đã thay đổi phân cấp khung nhìn một lần nữa của UITableView. – masam

10

Bạn có thể thực hiện việc này.

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

Đây là một cách quyến rũ và chắc chắn xứng đáng được nhiều phiếu bầu hơn. –

+0

Rất hay, rất vui khi biết thêm về điều này – vib

2

Đây là giải pháp nhanh cho câu trả lời đã chọn.

Tôi không thể sử dụng "MyTableView" được đặt tên kiểm tra phụ thuộc vì tôi đã có một BaseViewController tùy chỉnh mà nhiều bộ điều khiển xem có nguồn gốc từ. Một số bộ điều khiển chế độ xem có chế độ xem bảng, một số có chế độ xem bộ sưu tập hoặc cả hai nhưng trong mọi trường hợp, trình nhận dạng cử chỉ đánh cắp các lần chạm của chúng.

Tôi không muốn đặt xử lý mã trong mỗi lớp cử chỉ này, vì vậy cách duy nhất tôi nhận nó làm việc trong lớp cơ sở là:

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 
    } 

} 
Các vấn đề liên quan