Перезагрузить представление таблицы при редактировании UITextView внутри UITableViewCells

#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];
}