【问题标题】:How do I use multiple cells in a tableView using Rx?如何使用 Rx 在 tableView 中使用多个单元格?
【发布时间】:2020-12-20 08:27:24
【问题描述】:

我有一个tableView 和两个cellsStaticSupportTableViewCellSupportTableViewCell。顾名思义,第一个celltableView 之上的单个静态单元格。 SupportTableViewCell 可以是任意数字,应显示在静态 cell 下方。

我有binds 的代码并返回正确的cell

viewModel.multiContent.bind(to: tableView.rx.items) { tableView, index, item in
    if let cellViewModel = item as? StaticSupportTableViewCellViewModel {
        let cell = tableView.dequeueReusableCell(withIdentifier: StaticSupportTableViewCell.identifier) as? StaticSupportTableViewCell
        cell?.viewModel = cellViewModel
        guard let guardedCell = cell else { return UITableViewCell()}
        return guardedCell
}
    if let cellViewModel = item as? SupportTableViewCellViewModel {
        let cell = tableView.dequeueReusableCell(withIdentifier: SupportTableViewCell.identifier) as? SupportTableViewCell
        cell?.viewModel = cellViewModel
        guard let guardedCell = cell else { return UITableViewCell()}
        return guardedCell
    }
    else { return UITableViewCell() }
}.disposed(by: disposeBag)

viewModel 我有multiContent 变量:

var multiContent = BehaviorRelay<[Any]>(value: [])

现在,如果我将 cell viewModels 逐一接受到该继电器上,它就会起作用:

这有效: multiContent.accept([StaticSupportTableViewCellViewModel(myString: "TESTING")])

或者这样做: multiContent.accept(mainService.serviceProviders.compactMap { SupportTableViewCellViewModel(serviceProvider: $0, emailRelay: emailRelay)})

但如果我同时尝试两者...

multiContent.accept([StaticSupportTableViewCellViewModel(myString: "TESTING")])
        multiContent.accept(mainService.serviceProviders.compactMap { SupportTableViewCellViewModel(serviceProvider: $0, emailRelay: emailRelay)})

...只显示最后一个单元格。就像最后一个取代了第一个,而不是添加到它。

那么如何将cell viewModels 都接受到中继,以便两者都显示在tableView 中?

编辑 我通过将两个cell viewModels 加到一个array 中来做对了:

let contents: [Any] = [StaticSupportTableViewCellViewModel(brand: name, url: web.localized(), phoneNumber: phone.localized()), mainService.serviceProviders.compactMap { SupportTableViewCellViewModel(serviceProvider: $0, emailRelay: emailRelay)}]

并更改了binding

if let cellViewModels = item as? [SupportTableViewCellViewModel] {...

这是有问题的,因为我被 array[SupportTableViewCellViewModel] 困住了。当它们相互覆盖时,循环它们并返回 cells 是行不通的。

解决方案是发送cell viewModel SupportTableViewCellViewModel 而不是[SupportTableViewCellViewModel],但我该怎么做呢?

【问题讨论】:

    标签: ios swift uitableview tableview rx-swift


    【解决方案1】:

    BehaviorRelay 只发出最近接受的数组。当您调用accept(_:) 时,您并没有添加到继电器的状态,而是替换了它的状态。要同时发出两者,您需要连接两个数组。

    一般来说,您应该避免在生产代码中使用中继和主题。它们非常适合学习 Rx 系统和样本,但在现实世界的情况下很难做到。只有在将非 Rx 代码转换为 Rx 或设置反馈循环时才需要它们。

    此外,Subject、Relay 或 Observable 不应该是 var。您不想在安装后更换一个。改为lets。

    【讨论】:

    • 啊,是的,我尝试将它们一起添加到一个数组中,它.. 成功了。见编辑。
    • items 闭包中,item 是数组中的单个项目,而不是整个数组。我个人会将这两种类型包装在一个枚举中,而不是使用向下转换。
    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多