UITapGestureRecognizer прерывает UITableView didSelectRowAtIndexPath - PullRequest
192 голосов
/ 19 ноября 2011

Я написал свою собственную функцию для прокрутки текстовых полей вверх, когда появляется клавиатура. Чтобы отклонить клавиатуру, коснувшись текстового поля, я создал UITapGestureRecognizer, который заботится об отставке первого респондента в текстовом поле при нажатии.

Теперь я также создал автозаполнение для текстового поля, которое создает UITableView чуть ниже текстового поля и заполняет его элементами, когда пользователь вводит текст.

Однако при выборе одной из записей в таблице автозаполнения didSelectRowAtIndexPath не вызывается. Вместо этого, кажется, что вызывается распознаватель жестов касания, и он просто подает в отставку первого респондента.

Я предполагаю, что есть какой-то способ сказать распознавателю жестов касания продолжать передавать сообщение касания вниз до UITableView, но я не могу понять, что это такое. Любая помощь будет принята с благодарностью.

Ответы [ 18 ]

1 голос
/ 28 февраля 2015

Хотя уже поздно, и многие считают, что приведенные выше предложения работают нормально, я не смог заставить работать методы Джейсона или TMilligan.

У меня есть Static tableView с несколькими ячейками, содержащими textFieldsкоторые получают числовые входы, используя только цифровую клавиатуру.Для меня это было идеально:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if(![touch.view isKindOfClass:[UITableViewCell class]]){

        [self.firstTF resignFirstResponder];
        [self.secondTF resignFirstResponder];
        [self.thirdTF resignFirstResponder];
        [self.fourthTF resignFirstResponder];

        NSLog(@"Touches Work ");

        return NO;
    }
    return YES;
}

Убедитесь, что вы внедрили этот <UIGestureRecognizerDelegate> в свой файл .h.

Эта строка ![touch.view isKindOfClass:[UITableViewCell class]] проверяет, был ли задействован tableViewCell, и отклоняет любыеактивная клавиатура.

1 голос
/ 13 июля 2019

Для Swift 4.2 решение было реализовать UIGestureRecognizerDelegate и добавить следующее:

extension ViewController : UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        if touch.view!.isDescendant(of: tblView) {
            return false
        }
        return true
    }
}

при нажатии на табличное представление этот метод делегата возвращает значение false, а didSelectRowAtIndexPath метод табличного представления работает правильно.

0 голосов
/ 20 марта 2016

В Swift вы можете использовать это внутри

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if CheckTheTime() == true {
        // do something 
    }else{
    }
}

func CheckTheTime() -> Bool{
    return true
}
0 голосов
/ 23 марта 2014

Вот мое решение, которое напрямую связывает идентификатор устройства распознавания с распознаванием клавиатуры.

В вашем делегате распознавателя жестов касания:

#pragma mark - UIGestureRecognizerDelegate

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ([PFXKeyboardStateListener sharedInstance].visible) {
        return YES;
    }

    return NO;
}

И PFXKeyboardStateListener.h:

@interface PFXKeyboardStateListener : NSObject
{
    BOOL _isVisible;
}

+ (PFXKeyboardStateListener *)sharedInstance;

@property (nonatomic, readonly, getter=isVisible) BOOL visible;

@end

И PFXKeyboardStateListener.m:

static PFXKeyboardStateListener *sharedInstance;

@implementation PFXKeyboardStateListener

+ (PFXKeyboardStateListener *)sharedInstance
{
    return sharedInstance;
}

+ (void)load
{
    @autoreleasepool {
        sharedInstance = [[self alloc] init];
    }
}

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (BOOL)isVisible
{
    return _isVisible;
}

- (void)didShow
{
    _isVisible = YES;
}

- (void)didHide
{
    _isVisible = NO;
}

- (id)init
{
    if ((self = [super init])) {
        NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
        [center addObserver:self selector:@selector(didShow) name:UIKeyboardDidShowNotification object:nil];
        [center addObserver:self selector:@selector(didHide) name:UIKeyboardWillHideNotification object:nil];
    }
    return self;
}

@end

Возможно, вы захотите обновить шаблон синглтона слушателя клавиатуры, я до сих пор не дошел до него.Надеюсь, что это работает для всех остальных, а также для меня.^^

0 голосов
/ 02 мая 2014

Реализуйте этот метод для делегата UIGestureRecognizer:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
       shouldReceiveTouch:(UITouch *)touch
{
  UIView *superview = touch.view;
  do {
    superview = superview.superview;
    if ([superview isKindOfClass:[UITableViewCell class]])
      return NO;
  } while (superview && ![superview isKindOfClass:[UITableView class]]);

  return superview != nil;
}
0 голосов
/ 14 апреля 2018

ВОПРОС: В моем случае проблема заключалась в том, что я изначально поместил кнопку в каждую ячейку collectionView и установил ограничения для заполнения ячейки, чтобы при нажатии на ячейку она нажимала кнопку, однако функция кнопок была пустой, поэтому ничего не отображалось. происходит.

FIX: Я исправил это, удалив кнопку из ячейки представления коллекции.

0 голосов
/ 12 апреля 2018

Это мое решение, основанное на ответах выше ... Это сработало для меня ...

//Create tap gesture for menu transparent view
UITapGestureRecognizer *rightTableTransparentViewTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(rightTableTransparentViewTapMethod:)];
[rightTableTransparentViewTap setCancelsTouchesInView:NO];
[_rightTableTransparentView addGestureRecognizer:rightTableTransparentViewTap];

- (void)rightTableTransparentViewTapMethod:(UITapGestureRecognizer *)recognizer {
    //Write your code here
}
0 голосов
/ 01 июня 2016

Мой случай был другим, включая uisearchbar и uitableview в self.view.Я хотел отклонить клавиатуру uisearchbar, коснувшись вида.

var tapGestureRecognizer:UITapGestureRecognizer?

override func viewWillAppear(animated: Bool) {
    tapGestureRecognizer = UITapGestureRecognizer(target: self, action:Selector("handleTap:"))
}

В UISearchBar Делегаты Методы:

func searchBarShouldBeginEditing(searchBar: UISearchBar) -> Bool {
    view.addGestureRecognizer(tapGestureRecognizer!)
    return true
}
func searchBarShouldEndEditing(searchBar: UISearchBar) -> Bool {
    view.removeGestureRecognizer(tapGestureRecognizer!)
    return true
}

Когда пользователь касается self.view:

func handleTap(recognizer: UITapGestureRecognizer) {
    sampleSearchBar.endEditing(true)
    sampleSearchBar.resignFirstResponder()
}
...