UITableView по умолчанию повторно использует ячейки. Но в моем случае в некоторых ячейках есть объект UITextField, и я не хочу терять его значение при повторном использовании ячейки. В таблице несколько строк, поэтому я могу обрабатывать все ячейки в памяти.
Пример кода, который я использую сейчас:
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UINib(nibName: "TPAddressInfoTableViewCell", bundle: nil), forCellReuseIdentifier: InfoCellIdentifier)
...
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let item = items[indexPath.row]
switch item.appearance {
case .textWithTitle:
let cell = tableView.dequeueReusableCell(withIdentifier: InfoCellIdentifier) as! TPAddressInfoTableViewCell
return cell
case .picker:
...
Как правильно удерживать такие клетки? Связывание UITextFieldDelegate каждой ячейки с текущим UIViewController в этом случае кажется лишним.





Не удерживайте клетки.
Сохраните все значения элементов пользовательского интерфейса ячейки в модели данных и восстановите значения в cellForRow.
Например, передайте соответствующий элемент модели в ячейку в cellForRow и сохраните строку текстового поля в свойстве, когда оно изменится.
В качестве альтернативы используйте закрытие обратного вызова для обновления свойства в контроллере.
1) почему я не должен сохранять клетки? Механизм вывода из очереди предназначен для случаев, когда ячеек много. Но в моем случае иногда все ячейки видны, и поэтому все они являются отдельными объектами, и никто из них не используется повторно 2) обратный вызов для контроллера просмотра приводит к тому, что вы должны сохранить indexPath внутри ячейки (чтобы проверить, какое изменение пользователя textField), связать каждое текстовое поле делегат для просмотра контроллера, а затем в обратном вызове вы используете indexPath для поиска данных, которые вам нужно обновить. 2.2) «передать элемент модели в ячейку» - остается единственная проблема, что делать, если вам не нужно обрабатывать каждый ввод символа пользователя в textField.
1) Потому что это плохая практика. Ячейка предназначена только для отображения содержимого. Если табличное представление является статическим, используйте статические ячейки и выходы. 2) При использовании закрытия обратного вызова делегат текстового поля подключается к клетка, а путь индекса фиксируется в cellForRow.
1) статические ячейки доступны только при раскадровке. Почему не раскадровка - что, если мне нужно неопределенное количество статических ячеек с непредсказуемым порядком элементов? Или что, если многие клетки выглядят одинаково? Я не хочу создавать каждую подобную ячейку вручную 2) cellForRow принадлежит UITableDataSource, а не ячейке. Итак, поток данных результата: viewController -> cell -> textField -> cell -> viewController. В то же время, если ячейки статичны, viewController создает ячейку с внутренним содержимым один раз и считывает значения результатов только при необходимости.
вы должны использовать модель для хранения значений