1

我对你们中的任何人有一个要求。我想创建在单元格中有用户输入的 collectionview/tableview。来自这些输入的值的混合将代表状态。我想观察该状态,如果满足某些条件,我想重新创建所有单元格。我创建了非常简单的应用程序,在其中演示了我如何尝试实现它,但是我收到了重入警告,我很想了解您的想法/最佳实践。这是您可以结帐的回购。

https://github.com/beretis/CollectionViewTest

PS:我使用 RxData 源,我很想知道是什么导致了这种重入(我有我的想法)

4

1 回答 1

0

我以你的方式发送了一个请求请求。

回答这个问题的关键是在你的视图模型中有两个 Observable。一个代表每个单元格的编程状态(用户不输入的内容),一个代表每个单元格的用户输入状态。您使用某种 ID 值(我使用 UUID)连接来自这两个 Observable 的数据。因此,对于您的具体示例,集合的视图模型应如下所示:

typealias CellID = UUID

struct StaticCellState {
    let id: CellID
    let placeholder: String
}

struct CollectionViewModel {
    let cells: Observable<[StaticCellState]>
    let cellStates: Observable<[CellID: String]>
}

cellsobservable 包含占位符和单元 ID 。这是单元格在配置时使用的数据,并且在该配置的整个生命周期内都不会更改(如果重新使用单元格,它可能会更改。)只有在您要添加/删除单元格或更改单元格时才会更新特定单元格的占位符值。

observable 包含最新的cellStates用户输入值,并在用户每次输入单元格的文本字段之一时更新。

然后,通过从两个 observables 中传递该单元格的信息来配置您的单元格:

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
})
于 2019-05-14T11:45:20.600 回答