我是RxSwift的新手,我有以下代码来设置一个包含文本字段的tableview:
budget.expenses.asObservable() .bindTo(tableView.rx.items(cellIdentifier: ExpenseInputCell.cellIdentifier, cellType: ExpenseInputCell.self)){(row, element, cell) in cell.name.text = element.name.value cell.name.rx.text .bindTo(element.name) .addDisposableTo(self.disposeBag) } .addDisposableTo(disposeBag) tableView.rx.itemDeleted .subscribe(onNext: {indexPath in self.budget.expenses.value.remove(at: indexPath.row) }) .addDisposableTo(disposeBag)
一切工作正常,直到删除一行,因为然后混合了文本字段与数组中正确对象的绑定。例如,假设我在表视图中有7个项目,并且删除了第5行,新的第5和第6行的值都相同
问题在于订阅的生命周期element.name
。因为它与绑定self.disposeBag
,所以在重用单元格时不会将其释放,而在使用时会被释放self
。
您可能想要暴露一个新的处理袋,ExpenseInputCell
并用单元格的prepareForReuse
方法对其进行更新。
class ExpenseInputCell: UITableViewCell { // .. var disposeBag = DisposeBag() override func prepareForReuse() { self.diposeBag = DisposeBag() } }
和在视图控制器
budget.expenses.asObservable() .bindTo(tableView.rx.items(cellIdentifier: ExpenseInputCell.cellIdentifier, cellType: ExpenseInputCell.self)){(row, element, cell) in cell.name.text = element.name.value cell.name.rx.text .bindTo(element.name) .addDisposableTo(cell.disposeBag) } .addDisposableTo(disposeBag)