Я отправил запрос на получение доступа в вашу сторону.
Ключом к ответу на этот вопрос является наличие двух наблюдаемых в вашей модели представления. Один, который представляет программируемое состояние каждой ячейки (материал, который пользователь не вводит), и тот, который представляет пользовательское состояние ввода каждой ячейки. Вы связываете данные из этих двух Observables, используя какое-то значение идентификатора (я использую UUID.) Так что для вашего конкретного примера модель представления для коллекции должна выглядеть следующим образом:
typealias CellID = UUID
struct StaticCellState {
let id: CellID
let placeholder: String
}
struct CollectionViewModel {
let cells: Observable<[StaticCellState]>
let cellStates: Observable<[CellID: String]>
}
Наблюдаемая cells
содержит заполнитель и идентификатор ячейки. Это данные, которые ячейка использует, когда она настроена, и она не изменяется в течение срока службы этой конфигурации (она может измениться, если ячейка будет использоваться повторно.) Она обновляется, только если вы хотите добавить / удалить ячейку или изменить значение заполнителя конкретной ячейки.
Наблюдаемая cellStates
содержит последние введенные пользователем значения и обновляется каждый раз, когда пользователь вводит в одно из текстовых полей ячеек.
Затем вы настраиваете свои ячейки, передавая информацию для этой ячейки из обеих наблюдаемых:
let dataSource = RxCollectionViewSectionedReloadDataSource<SectionOfCustomData>(
configureCell: { dataSource, collectionView, indexPath, item in
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as? SomeCell else { return UICollectionViewCell() }
let output = cell.configure(with: item, initial: viewModel.cellStates.map { $0[item.id]! })
output
.bind(to: itemEdit)
.disposed(by: cell.disposeBag)
return cell
})