У меня кот UITableView
с UITextField
тенью клетки. Я хотел бы убрать клавиатуру, когда заден фон UITableView
. Я пытаюсь сделать это, создав UIButton
размер UITableView
и поместив его за UITableView
. Единственная проблема заключается в том, что UIButton
он улавливает все касания, даже если касание находится в UITableView. Что я делаю не так?
Спасибо!
ios
uitableview
uikeyboard
Хуа-Инь
источник
источник
Ответы:
Это легко сделать, создав объект UITapGestureRecognizer (по умолчанию он будет обнаруживать «жест» при однократном касании, поэтому дальнейшая настройка не требуется), указав цель / действие при срабатывании жеста, а затем прикрепив объект распознавателя жестов к вашему виду таблицы.
Например, возможно, в вашем
viewDidLoad
методе:И
hideKeyboard
метод может выглядеть так:Обратите внимание, что жест не срабатывает при касании внутри
UITextField
объекта. Он запускается, хотя наUITableView
фоне, в нижнем колонтитуле, в виде заголовка,UILabels
внутри ячеек и т. Д.источник
gestureRecognizer.cancelsTouchesInView = NO;
hideKeyboard
метода, вместо того, чтобы общаться напрямую с текстовыми полями, вы можете это сделать[self.view endEditing:NO];
. Из документов Apple: « Этот метод просматривает текущее представление и его иерархию вложенных представлений для текстового поля, которое в настоящее время является первым респондентом. Если он находит его, он просит это текстовое поле отказаться от роли первого респондента. Если для параметра force установлено значение ДА, текстовое поле даже не запрашивается; оно вынуждено уйти в отставку. "Решение UITapGestureRecognizer работает с выбором ячейки таблицы, если вы установили:
источник
shouldReceiveTouch
Вот лучший способ сделать это. Просто сделай это
или
источник
Вы также можете сделать это из раскадровки:
источник
Как
UITableView
и подклассUIScrollView
, реализация одного метода делегата ниже обеспечивает чрезвычайно простое и быстрое решение. Нет необходимости даже вовлекать,resignFirstResponder
так как иерархия просмотра самоанализирует и находит текущего респондента и просит его отказаться от статуса респондента.И не забудьте добавить
UIScrollViewDelegate
в файл заголовка.источник
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.onDrag
Во-первых, прислушайтесь к
scrollViewWillBeginDragging
своемуUIViewController
, добавивUIScrollViewDelegate
:В файле .h:
В файле .m:
Затем прислушайтесь к другим взаимодействиям:
Затем реализуйте
dismissKeyboard
:И если, как и я, вы хотели отклонить клавиатуру для UITextField внутри настраиваемой ячейки таблицы:
Надеюсь, что это поможет любому ищущему !!
источник
источник
Вот быстрая версия для вашего удовольствия от программирования:
Он добавляет распознаватель жестов касания, а затем закрывает клавиатуру. Никакого выхода для TextField не требуется!
источник
Есть версия Swift 3 без блокировки кранов по ячейкам.
В
viewDidLoad()
методе:И
hideKeyboard
выглядит так:источник
У меня так получилось:
Создайте метод в своем TableViewController для деактивации первого респондента (который в этот момент будет вашим TextBox)
В
tableView:didSelectRowAtIndexPath:
вызове предыдущего метода:источник
didSelectRowAtIndexPath
не сработает, если вы коснетесь самого TableView.У меня была
UITableViewController
и реализацияtouchesBegan:withEvent:
не сработала.Вот что сработало:
Swift:
Цель-C:
источник
Затем убедитесь, что в вашем файле Nib вы установили тип своего UITableView на DismissableUITableView ..... возможно, я мог бы придумать лучшее имя для этого класса, но вы поняли.
источник
Если вы ориентируетесь на iOS7, вы можете использовать одно из следующего:
Первый будет анимировать клавиатуру за пределами экрана при прокрутке таблицы, а второй скроет клавиатуру, как стандартное приложение Messages.
Обратите внимание, что это from
UIScrollView
, которыйUITableView
наследуется от.источник
Попробуй это:
источник
UITableView - это подкласс UIScrollView.
Я сделал это так, чтобы прослушать событие прокрутки пользователя, а затем resignFirstResponder. Вот метод UIScrollViewDelegate для реализации в вашем коде;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
При решении подобных задач я нашел лучший способ - исследовать протоколы делегатов для каждого объекта и родительских классов (в данном случае UITableViewDelegate, UIScrollViewDelegate. Количество событий, возникающих у NS-объектов, довольно велико и всесторонне. также проще реализовать протокол, чем создавать подклассы.
источник
У меня была такая же проблема, и вот мое решение, оно отлично работает для меня:
В представлении или контроллере представления, который вы реализовали
<UITextFieldDelegate>
(В моем случае у меня есть обычай
UITableViewCell
TextFieldCell),Объявить
UITapGestureRecognizer
как свойство:И инициализируйте его в своем представлении / контроллере:
В этом
- (void)textFieldDidBeginEditing:(UITextField *)textField
методе используйтеsuperView
для перехода к вашему tableView и вызовитеaddGestureRecognizer
:И в
- (void)textFieldDidEndEditing:(UITextField *)textField
, просто удалите распознаватель жестов:Надеюсь, поможет.
источник
Я хотел, чтобы моя ячейка открывала клавиатуру, когда была выделена какая-либо часть ячейки, и закрывала ее, если вы щелкали в любом месте ячейки. Чтобы открыть клавиатуру:
(ПРИМЕЧАНИЕ: я создал подклассы ячейки, но вы можете легко добиться этого с помощью
tableView:didSelectRowAtIndexPath:
метода делегатаUITableView
)Это означало, что с лучшими решениями, если вы дважды щелкнете по ячейке, клавиатура будет дрожать, поскольку сначала распознаватель жестов попытался закрыть клавиатуру, а во-вторых, ячейка была повторно выбрана и попыталась открыть клавиатуру.
Решение - проверить, произошел ли щелчок внутри текущей выбранной ячейки:
источник
Я нашел решение, которое отлично работает.
Необходимо использовать UIGestureRecognizerDelegate и метод - gestureRecognizer: shouldReceiveTouch: .
Добавьте распознаватель жестов в TableView следующим образом:
Затем реализуйте метод делегата shouldReceiveTouch для отклонения касаний, выполняемых в классе UITableViewCell. Метод hideKeyboard будет вызываться только тогда, когда прикосновение было выполнено вне класса UITableViewCell.
источник
UITableView
имеет удобноеbackgroundView
свойство, с помощью которого я добился такого поведения, не вмешиваясь в выбор ячеек, как показано ниже в Swift:источник
Я искал решение и не нашел ничего подходящего для моего кода, поэтому сделал это так:
http://82517.tumblr.com/post/13189719252/dismiss-keyboard-on-uitableview-non-cell-tap
Это в основном комбинация вышеупомянутых подходов, но не требует создания подклассов или создания фоновых кнопок.
источник
Простое использование UITapGestureRecognizer
cancelsTouchesInView = NO
означает, что касания ячеек и UITextViews также запускают скрытие. Это плохо, если у вас есть несколько UITextView, и вы нажимаете на следующий. Клавиатура начнет скрываться, а затем следующий textView станет firstResponder, и клавиатура снова станет видимой. Чтобы этого избежать, проверьте место касания и скрывайте клавиатуру только в том случае, если касание не находится в ячейке:Чтобы
scrollViewWillBeginDragging:
сработало,scrollEnabled
свойство tableView должно бытьYES
источник
Почему вы хотите создать таблицу, полную текстовых полей? Вы должны использовать подробное представление для каждой строки, содержащей текстовые поля. При отправке подробного просмотра убедитесь, что вы вызываете «[myTextField статьFirstResponder]», чтобы пользователь мог начать редактирование одним щелчком мыши от списка таблиц.
источник
Если вы хотите создать подкласс (тьфу!) Для представления таблицы, то может сработать что-то вроде этого :
источник
Если вы хотите закрыть клавиатуру, пока нажата клавиша возврата, вы можете просто добавить следующий код в textField, который должен возвращать метод, т.е.
Некоторые текстовые поля могут иметь представление средства выбора или какое-либо другое в качестве подпредставления, поэтому в этом случае вышеуказанный метод не работает, поэтому в этом случае нам нужно использовать класс UITapGestureRecognizer, т.е. добавить следующий фрагмент кода в метод viewDidLoad, т.е.
Теперь просто добавьте ответчика об отставке к методу выбора, то есть:
Надеюсь, это поможет, спасибо :)
источник
Много интересных ответов. Я хотел бы скомпилировать различные подходы в решение, которое, по моему мнению, лучше всего подходит для сценария UITableView (это тот, который я обычно использую): обычно мы хотим скрыть клавиатуру в двух сценариях: при нажатии за пределами текстовых элементов пользовательского интерфейса, или при прокрутке вниз / вверх UITableView. Первый сценарий мы можем легко добавить с помощью TapGestureRecognizer, а второй - с помощью метода scrollViewWillBeginDragging: UIScrollViewDelegate. Первый порядок работы, способ скрыть клавиатуру:
Этот метод отменяет любой пользовательский интерфейс textField вложенных представлений в иерархии представлений UITableView, поэтому он более практичен, чем отказ от каждого отдельного элемента по отдельности.
Затем мы позаботимся об отклонении с помощью внешнего жеста Tap, с помощью:
Установка для параметра tapGestureRecognizer.cancelsTouchesInView значения NO означает, что gestureRecognizer не переопределяет обычную внутреннюю работу UITableView (например, не мешает выделению ячейки).
Наконец, чтобы скрыть клавиатуру при прокрутке вверх / вниз UITableView, мы должны реализовать метод scrollViewWillBeginDragging: протокола UIScrollViewDelegate, как:
.h файл
.m файл
Я надеюсь, что это помогает! знак равно
источник
Вот как я наконец добился работы. Я объединил предложения и коды из разных ответов. Возможности: отключение клавиатуры, перемещение текстовых полей над клавиатурой при редактировании и установка типа возврата клавиатуры «Далее» и «Готово». ЗАМЕНИТЕ «...» с другими полями
источник
Ответ @ mixca очень полезен, но что, если у меня что-то отличается от UITextField. Я думаю, что лучший способ справиться с этим, выполнив поиск всех подвидов основного представления с рекурсивной функцией, проверьте пример ниже
а также вы можете поместить этот метод в свой служебный класс и использовать жест касания, например ответ @ mixca ..
источник
Свифт 4 / 4,2 / 5
Вы также можете закрыть клавиатуру при нажатии на ячейку - прежде чем делать что-либо еще.
источник
tableView.keyboardDismissMode = .onDrag //. интерактивный
источник