让我们假设我们有一个牢房。 假设我们有一个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:(