#ios #uitableview #uitextview
#iOS #uitableview #uitextview
Вопрос:
У меня есть несколько настраиваемых UITableViewCells, которые содержат UITextView и набор кнопок. Кнопки в ячейке должны быть видны только тогда, когда пользователь пытается отредактировать текстовое представление в соответствующей ячейке. Итак, если пользователь пытается отредактировать текстовое представление в ячейке1, то набор кнопок должен быть виден под текстовым представлением в ячейке1, а высота ячейки1 также должна быть увеличена. Теперь, если пользователь пытается отредактировать текстовое представление в ячейке2, то набор кнопок должен быть виден под текстовым представлением в ячейке2, а высота ячейки2 также должна быть увеличена, тогда как кнопки в ячейке1 должны быть удалены, и размер ячейки должен быть рассчитан соответствующим образом.
Для этого я попытался перезагрузить ячейки представления таблицы из textViewDidBeginEditing:. Это правильно перезагружает ячейки и правильно отображает / скрывает кнопки в требуемых ячейках, но не позволяет корректно редактировать текстовое представление. Когда пользователь пытается редактировать с помощью textview, методы перезагрузки tableview вызываются постоянно и не позволяют клавиатуре стоять для редактирования.
Правильно ли обрабатывать перезагрузку из textViewDidBeginEditing: в первую очередь? есть ли какой-нибудь лучший способ сделать это? пожалуйста, помогите.
Комментарии:
1. поместите некоторый код, который вы используете в своем проекте
Ответ №1:
Во-первых, я бы посоветовал не перезагружать весь TableView каждый раз. Вместо этого используйте
reloadRowsAtIndexPaths
метод загрузки только той ячейки, в которой вы хотите внести изменения.
Далее, чтобы решить вашу проблему, касающуюся TextView, вы могли бы сделать что-то вроде этого, объявить свойство класса типа bool и установить для него значение false . Когда вы перезагружаете свою ячейку в первый раз, установите для нее значение true. Теперь в методе редактирования textViewDidBegin проверьте наличие этого bool. Если для него установлено значение true, это означает, что вы уже загрузили ячейку и вам не нужно загружать ее снова, поэтому в этом случае не вызывайте метод reloadRows . В противном случае, если оно равно false, перезагрузите строки и установите для этого bool значение true. Теперь в методе делегата textViewDidEndEditing снова установите для этого bool значение false, чтобы при нажатии пользователем на другой TextView в какой-либо другой строке он перезагружался должным образом.
Эта логика может быть не идеальной, вам может потребоваться некоторая настройка. Но это сделает работу
Ответ №2:
Явно сделайте текстовое поле первым ответчиком
if buttonsDisplayed == NO {
reload cell
}
if textFieldIsFirstResponder == NO {
[textField becomeFirstResponder];
}