Сохранить ячейки в UITableView в Swift?

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 в этом случае кажется лишним.

вы должны использовать модель для хранения значений

Devil Decoder 26.12.2018 09:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
555
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не удерживайте клетки.

Сохраните все значения элементов пользовательского интерфейса ячейки в модели данных и восстановите значения в cellForRow.

Например, передайте соответствующий элемент модели в ячейку в cellForRow и сохраните строку текстового поля в свойстве, когда оно изменится. В качестве альтернативы используйте закрытие обратного вызова для обновления свойства в контроллере.

1) почему я не должен сохранять клетки? Механизм вывода из очереди предназначен для случаев, когда ячеек много. Но в моем случае иногда все ячейки видны, и поэтому все они являются отдельными объектами, и никто из них не используется повторно 2) обратный вызов для контроллера просмотра приводит к тому, что вы должны сохранить indexPath внутри ячейки (чтобы проверить, какое изменение пользователя textField), связать каждое текстовое поле делегат для просмотра контроллера, а затем в обратном вызове вы используете indexPath для поиска данных, которые вам нужно обновить. 2.2) «передать элемент модели в ячейку» - остается единственная проблема, что делать, если вам не нужно обрабатывать каждый ввод символа пользователя в textField.

Vyachaslav Gerchicov 26.12.2018 10:19

1) Потому что это плохая практика. Ячейка предназначена только для отображения содержимого. Если табличное представление является статическим, используйте статические ячейки и выходы. 2) При использовании закрытия обратного вызова делегат текстового поля подключается к клетка, а путь индекса фиксируется в cellForRow.

vadian 26.12.2018 11:00

1) статические ячейки доступны только при раскадровке. Почему не раскадровка - что, если мне нужно неопределенное количество статических ячеек с непредсказуемым порядком элементов? Или что, если многие клетки выглядят одинаково? Я не хочу создавать каждую подобную ячейку вручную 2) cellForRow принадлежит UITableDataSource, а не ячейке. Итак, поток данных результата: viewController -> cell -> textField -> cell -> viewController. В то же время, если ячейки статичны, viewController создает ячейку с внутренним содержимым один раз и считывает значения результатов только при необходимости.

Vyachaslav Gerchicov 26.12.2018 11:15

Другие вопросы по теме