Тап на UIBarButtonItem не игнорируется TapGestureRecognizer

У меня есть представление с UIToolbar с несколькими UIBarButtonItems и UITableView, содержащим несколько UITextFields.

Я хотел бы отключить клавиатуру для текстового поля одним касанием в любом месте. Поэтому я добавил в представление TapGestureRecognizer. Чтобы TapgestureRecognizer не обрабатывал нажатия на UIBarButtonItems, я добавил следующий метод (делегат установлен).

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    UIView *view = touch.view;
    while (view) {
         NSLog(@"Class of view: %@", NSStringFromClass([view class]));
         view = view.superview;
    }

    // Disallow recognition of tap gestures in the toolbar
    if ([touch.view isKindOfClass:[UIToolbar class]]) {
        return NO;
    }

    if ([touch.view.superview isMemberOfClass:[UIToolbar class]]) {
         return NO;
    }

    return YES;
}

UIBarButtonItem сам по себе не является представлением, но имеет UIToolbar в качестве суперпредставления. Когда я использую описанный выше метод, проверка isKindOfClass: [класс UIToolbar] не работает для всех нажатий на панели инструментов. Однако проверка супервизора с помощью isMemberOfClass:[UIToolbar class] работает.

Я этого не понимаю. Может быть, кто-то может объяснить такое поведение?


person Leontien    schedule 23.08.2013    source источник


Ответы (1)


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

Лучший подход — добавить жест в табличное представление (или другое подходящее представление, представляющее интересующую вас область). Только обязательно включайте и отключайте жест в нужное время, чтобы не блокировать обычную работу стола.

person Wain    schedule 23.08.2013
comment
Спасибо за совет, но он не отвечает на вопрос. С оператором NSLog я вижу, что UIToolbar находится в иерархии представлений положения касания. Но isKindOfClass [класс UIToolbar] возвращает НЕТ. Почему? - person Leontien; 23.08.2013
comment
Насколько высоко в цепочке супервизора находится панель инструментов? - person Wain; 23.08.2013
comment
Это супервизор touch.view: Touch.view.superview - person Leontien; 23.08.2013