RxSwift,UITableViewCell和交互+模型

时间:2018-06-28 10:18:43

标签: ios swift uitableview rx-swift

让我们假设我们有一个牢房。 假设我们有一个viewModels数组。 让我们用viewModel配置单元格

        presenter.dataSource
        .bind(to: tableView.rx.items(cellIdentifier: "InvoiceTableViewCell", cellType: InvoiceTableViewCell.self)) { [weak self] row, element, cell in
            cell.configureWith(element)
        }
        .disposed(by: disposeBag)

直到这一刻,一切都很好。让我们继续进行另一个假设。

让我们假设单元格有一个按钮showDetail。 点击后,我们应该展开单元格,并在viewModel中记住该单元格已展开。

让我们还假设从视觉角度看细胞扩增是正确的。

因此单元格具有状态
let isExpanded = Variable<Bool>(false) 点击时我们正在执行

@IBAction private func detailsAction(_ sender: Any) {
    isExpanded.value = !isExpanded.value
    contentView.layoutIfNeeded()
}

在我们观察的同时:

 isExpanded.asObservable()
            .map{ !$0 }
            .bind(to: separatorView.rx.isHidden)
            .disposed(by: disposeBag)

现在,在更改isExpanded时,我们想在viewModel中记住该特定单元格应该进行扩展。

所以我尝试了绑定:

cell.isExpanded.asObservable()
    .subscribe(onNext: { isExpanded in
        model.isExpanded = isExpanded
    })
    .disposed(by: disposeBag)

现在让我们向下滚动tableView。使reusableCells出队被多次调用。但是,isExpanded变量未重置。结果,随机单元格显示为展开。

所以这个想法是让我们使用disposeBag!

override func prepareForReuse() {
    super.prepareForReuse()
    isExpanded.value = false
    disposeBag = DisposeBag()
}

现在,我们正在重置isExpanded变量,因此出队单元将不会扩展。 可是不行!我们仍在订阅model.isExpanded。

此方法的副作用是模型不再保存有关爆炸细胞的信息。

我可以准备一种单独的方法来解决Rx绑定。但是我不想!

我的问题是:  -如何将viewModel与单元格状态绑定  -如何在不影响先前模型的情况下在出队时重置单元状态?

因为现在我遇到了一些循环订阅。 变量影响viewModel 变量影响dequequeedCells 准备重用正在影响viewModel。

所以效果是viewModel = true,出队变量= false-> viewModel = false:(

0 个答案:

没有答案