【问题标题】:RxSwift MVVM tableview/collectionview with user input cells representing stateRxSwift MVVM 表视图/集合视图,用户输入单元表示状态
【发布时间】:2019-05-09 09:55:35
【问题描述】:

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

https://github.com/beretis/CollectionViewTest

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

【问题讨论】:

    标签: rx-swift rx-cocoa rxdatasources


    【解决方案1】:

    我按照你的方式发送了一个拉取请求。

    回答这个问题的关键是在你的视图模型中有两个 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]>
    }
    

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

    cellStates observable 包含最新的用户输入值,并且每次用户在其中一个单元格的文本字段中键入时都会更新。

    然后您通过从两个可观察对象中传递该单元格的信息来配置您的单元格:

    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
    })
    

    【讨论】:

    • 您好,首先感谢您的时间和精力,像您这样的人是沉浸式的帮助。抱歉回复晚了,我现在正在休假。我会检查你的 PR 并讨论。
    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多