Я написал свою собственную функцию для прокрутки текстовых полей, когда появляется клавиатура. Для того, чтобы отклонить клавиатуру, нажав на текстовое поле, я создал функцию, UITapGestureRecognizer
которая заботится об отставке первого респондента в текстовом поле при нажатии.
Теперь я также создал автозаполнение для UITableView
текстового поля, которое создает чуть ниже текстового поля и заполняет его элементами, когда пользователь вводит текст.
Однако при выборе одной из записей в таблице автозаполнения didSelectRowAtIndexPath
не вызывается. Вместо этого, кажется, что распознаватель жестов касания вызывается и просто уходит в отставку первого респондента.
Я предполагаю, что есть какой-то способ сказать распознавателю жестов касания продолжать передавать сообщение касания вниз UITableView
, но я не могу понять, что это такое. Любая помощь будет принята с благодарностью.
источник
Ответы:
Хорошо, наконец нашел его после некоторого поиска в документах распознавателя жестов.
Решением было реализовать
UIGestureRecognizerDelegate
и добавить следующее:Это позаботилось об этом. Надеюсь, это поможет и другим.
источник
return ![touch.view isKindOfClass:[UITableViewCell class]];
![touch.view isEqual: self.tableView] &&
перед тем,[touch.view isDescendantOfView: self.tableView]
чтобы исключитьtableView
саму себя (потому чтоisDescendantOfView:
также возвращается,YES
если аргумент-представление - это само представление-получатель). Надеюсь, что это помогает другим людям, которые хотят того же результата.Самый простой способ решить эту проблему - это:
Это позволяет
UIGestureRecognizer
распознать касание, а также передать касание следующему респонденту. Непреднамеренное последствие этого метода, если у вас естьUITableViewCell
экран, который выдвигает другой контроллер представления. Если пользователь коснется строки, чтобы закрыть клавиатуру, клавиатура и нажатие будут распознаны. Я сомневаюсь, что это то, что вы намерены, но этот метод подходит для многих ситуаций.Кроме того, подробно остановившись на ответе Роберта, если у вас есть указатель на рассматриваемое табличное представление, вы можете напрямую сравнить его класс вместо преобразования в строку и надеяться, что Apple не изменит номенклатуру:
Помните, вы также должны объявить, что
UIGestureRecognizer
у вас есть делегат с этим кодом.источник
isDescendantOfView
вместо простой проверкиclass
, равен ли он, так как вы можете нажимать на подпредставление. Зависит от того, что вам нужно.Набор
cancelsTouchesInView
вашего распознавателя на ложь. В противном случае он «потребляет» касание для себя и не передает его в табличное представление. Вот почему событие выбора никогда не происходит.например в
swift
источник
И для Свифта (основываясь на ответе @Jason):
источник
Возможно, у меня есть лучшее решение, чтобы добавить жест касания к представлению таблицы, но в то же время разрешить выбор ячейки:
Я просто ищу ячейку в той точке экрана, где пользователь нажимает. Если индексный путь не найден, тогда я позволяю жесту получить касание, иначе я отменяю его. Для меня это прекрасно работает.
источник
Я думаю , нет необходимости писать блоки кодов просто набор
cancelsTouchesInView
дляfalse
вашего объекта жеста, по умолчанию это ,true
и вы просто должны установить егоfalse
. Если вы используетеUITapGesture
объект в своем коде, а также используетеUIScrollView
(tableview, collectionview), установите это свойствоfalse
источник
Аналогичное решение заключается в реализации
gestureRecognizer:shouldReceiveTouch:
с использованием класса представления, чтобы определить, какое действие предпринять. Преимущество этого подхода состоит в том, что он не маскирует ответвления в области, непосредственно окружающей таблицу (представления этой области все еще происходят от экземпляров UITableView, но не представляют ячейки).Это также имеет преимущество в том, что он работает с несколькими таблицами в одном представлении (без добавления дополнительного кода).
Предостережение: есть предположение, что Apple не изменит название класса.
источник
return ![[touch.view.superview class] isSubclassOfClass:[UITableViewCell class]];
Для Swift 4.2 решением было реализовать
UIGestureRecognizerDelegate
и добавить следующее:при нажатии на табличное представление этот метод делегата возвращает false, а
didSelectRowAtIndexPath
метод табличного представления работает правильно.источник
У меня была другая ситуация, когда я хотел, чтобы функция жеста касания вызывалась только тогда, когда пользователь нажимал вне таблицы. Если пользователь нажал внутри табличного представления, то функция жеста касания не должна вызываться. Кроме того, если вызывается функция жеста касания, она все равно должна передавать событие касания в представление, к которому было применено нажатие, а не потреблять его.
Полученный код представляет собой комбинацию ответа Абдулрахмана Масуда и ответа Николая Нильсена.
И в
MyViewController
классе, который имеетUITableView
, вonViewDidLoad()
, я обязательно позвонилaddGestureRecognizer()
:источник
Просто установите
cancels touches in view
наfalse
любой жест под(table/collection)View
:- Интерфейсный строитель
- Код
источник
Хотя уже поздно, и многие считают, что приведенные выше предложения работают нормально, я не мог заставить методы Джейсона или TMilligan работать.
У меня есть Static tableView с несколькими ячейками, содержащими текстовые поля, которые получают числовые входы, используя только цифровую клавиатуру. Это было идеально для меня:
Убедитесь, что вы реализовали это
<UIGestureRecognizerDelegate>
в своем .h файле.Эта строка
![touch.view isKindOfClass:[UITableViewCell class]]
проверяет, был ли нажат tableViewCell, и отклоняет любую активную клавиатуру.источник
Простое решение - использовать экземпляры UIControl в UITableViewCell для получения прикосновений. Вы можете добавить любые представления с userInteractionEnables == НЕТ в UIControl, чтобы получить ответвления.
источник
Вот моё решение, которое напрямую связывает идентификатор mustReceiveTouch распознавателя с тем, показывает ли клавиатура.
В вашем кране жест распознавания делегата:
И то
PFXKeyboardStateListener.h
:И то
PFXKeyboardStateListener.m
:Возможно, вы захотите обновить шаблон синглтона слушателя клавиатуры, я пока не дошел до него. Надеюсь, что это работает для всех остальных, а также для меня. ^^
источник
Реализуйте этот метод для делегата UIGestureRecognizer:
источник
В Swift вы можете использовать это внутри
источник
Мой случай был другим, включая uisearchbar и uitableview для self.view. Я хотел отклонить клавиатуру uisearchbar, касаясь вида.
Методы делегирования UISearchBar:
Когда пользователь касается self.view:
источник
Свифт 5 мая 2020 года.
У меня есть textField и tableView, который становится видимым при вводе текста.
Исходное состояние Итак, я хочу 2 разных события, когда я нажимаю tableViewCell или что-то еще.
Клавиатура и tableView показываются
Сначала мы добавляем tapGestureRecognizer.
Затем мы добавляем следующую проверку в UIGestureRecognizerDelegate:
}
Если я сначала хочу скрыть клавиатуру, tableView остается видимым и реагирует на мои нажатия.
введите описание изображения здесь
источник
Это мое решение, основанное на приведенных выше ответах ... Это сработало для меня ...
источник
ПРОБЛЕМА: В моем случае проблема заключалась в том, что я изначально помещал кнопку в каждую ячейку collectionView и устанавливал ограничения для заполнения ячейки, чтобы при нажатии на ячейку она нажимала кнопку, однако функция кнопок была пустой, поэтому ничего не было. кажется, что происходит.
ИСПРАВЛЕНИЕ: я исправил это, удалив кнопку из ячейки представления коллекции.
источник