TableViewCells在滚动Rxwift时发生变化



我的表视图单元格在向下滚动时发生更改。我使用rxswift将表视图与可观察对象绑定。如何确保单元格具有真实值,并且在滚动时不会发生更改?

这是我的代码:let observableItems=viewModel.getShoppingList((.asObservable((

observableItems.bind(to: tableViewShoppingList.rx.items(cellIdentifier: "shoppingListCell", cellType: ShoppingListTableViewCell.self)) { (row, element, cell) in
print(row)
cell.nameTextField.text = element.title

cell.amountLabel.isHidden = true
//Check if Amount is nil
if element.amount == "" {
cell.amountTextField.placeholder == "Menge"
} else {
cell.amountTextField.text = element.amount
}
//Amount TextField
cell.amountTextField
.rx
.controlEvent([.editingDidEnd])
.withLatestFrom(cell.amountTextField.rx.text)
.subscribe(onNext: {[weak self] (text) in
if text == "" {
//DO NOTHING
} else {
guard let text = text else { return }
let data = ShoppingListData(_id: element.id, title: element.title, amount: text, status: element.status, position: element.position)
self?.viewModel.updateShoppingListItem(data: data)
}
})
.addDisposableTo(cell.bag)
//Check Status
if element.status == true {
cell.checkMarcButton.isSelected = true
} else {
cell.checkMarcButton.isSelected = false
}
//Checkmarc Button
cell.checkMarcButton.rx.tap.asDriver()
.drive(onNext: { [weak self] in
if cell.checkMarcButton.isSelected {
cell.checkMarcButton.isSelected = false
let data = ShoppingListData(_id: element.id, title: element.title, amount: element.amount, status: false, position: element.position)
self?.viewModel.updateShoppingListItem(data: data)
} else {
cell.checkMarcButton.isSelected = true
let data = ShoppingListData(_id: element.id, title: element.title, amount: element.amount, status: true, position: element.position)
self?.viewModel.updateShoppingListItem(data: data)
}
}).disposed(by: cell.bag)

//TableView Style
cell.selectionStyle = UITableViewCell.SelectionStyle.none
}.addDisposableTo(disposeBag)

我认为问题发生在cell.bag上,因为UITableViewCell是可重用的,所以这部分的代码将被多次实现

//Amount TextField
cell.amountTextField
.rx
.controlEvent([.editingDidEnd])
.withLatestFrom(cell.amountTextField.rx.text)
.subscribe(onNext: {[weak self] (text) in
if text == "" {
//DO NOTHING
} else {
guard let text = text else { return }
let data = ShoppingListData(_id: element.id, title: element.title, amount: text, status: element.status, position: element.position)
self?.viewModel.updateShoppingListItem(data: data)
}
})
.addDisposableTo(cell.bag)

在这种情况下,您应该让您的cell.bag为var,并在每次设置值时重新启动袋子。

我建议你在关闭中添加一行

cell.bag = DisposeBag()

一切都会好起来的。

最新更新