Подтвердить что ты не робот

ShouldReceiveTouch в UITableViewCellContentView

Я пытаюсь игнорировать метки UITapGestureRecognizer в UITableView со следующим:

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

Он не будет компилироваться: "Использование необъявленного идентификатора" UITableViewCellContentView "

Недокументированный класс? Нужен ли подкласс? Лучший способ добиться этого?

Спасибо за любую помощь.

4b9b3361

Ответ 1

Это похоже на это:

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

Ответ 2

Вы можете сделать это.

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

Ответ 3

Я только что наткнулся на эту проблему, и следующее решение работает на всех версиях iOS, не рискуя Apple изменить иерархию представлений 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.

Ответ 4

Здесь быстрое решение для выбранного ответа.

Я не мог использовать "проверку MyTableView" с именем dependency, потому что у меня был пользовательский BaseViewController, из которого выходят многие контроллеры представлений. Некоторые диспетчеры представлений имеют табличное представление, некоторые из них имеют представление коллекции или оба, но во всех случаях распознаватель жестов крадет их штрихи.

Я не хотел помещать этот код обработки жестов в каждый подкласс, поэтому единственный способ заставить его работать в базовом классе:

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
    }

}