RxSwift MVVM таблица / коллекция с ячейками пользовательского ввода, представляющими состояние - PullRequest
1 голос
/ 09 мая 2019

У меня есть один запрос для любого из вас. Я хочу создать коллекцию / табличное представление, которое будет иметь пользовательские вводы в ячейках. Смесь значений из этих входов будет представлять состояние. Я хочу наблюдать это состояние и, если выполняются некоторые условия, я хочу воссоздать все ячейки. Я создал очень простое приложение, в котором я демонстрирую, как я пытался его реализовать, но я получаю предупреждение о повторном входе, и я хотел бы узнать ваши идеи / лучшие практики для этого. Вот репо, который вы можете оформить.

https://github.com/beretis/CollectionViewTest

PS: я использую источники RxData, и я хотел бы точно знать, что является причиной этого возвращения (у меня есть идея)

1 Ответ

0 голосов
/ 14 мая 2019

Я отправил запрос на получение доступа в вашу сторону.

Ключом к ответу на этот вопрос является наличие двух наблюдаемых в вашей модели представления. Один, который представляет программируемое состояние каждой ячейки (материал, который пользователь не вводит), и тот, который представляет пользовательское состояние ввода каждой ячейки. Вы связываете данные из этих двух 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
})
...