RxSwift - tableview中的Textfield-Variable绑定

时间:2017-01-14 10:12:27

标签: ios swift rx-swift rx-cocoa

我是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)

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

1 个答案:

答案 0 :(得分:4)

问题在于订阅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)