3

我是 RxSwift 的新手,我有这段代码来设置一个包含文本字段的表格视图:

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)

在删除一行之前一切正常,因为文本字段与数组中正确对象的绑定被混淆了。例如,假设我在 tableview 中有 7 个项目,我删除了第 5 行,新的第 5 行和第 6 行都具有相同的值

4

1 回答 1

8

问题在于订阅的生命周期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)
于 2017-01-16T11:43:51.837 回答