使用 RxSwift/RxCocoa 制作的 TableView 在绑定到的变量中的数据更改后出现故障
Posted
技术标签:
【中文标题】使用 RxSwift/RxCocoa 制作的 TableView 在绑定到的变量中的数据更改后出现故障【英文标题】:TableView made with RxSwift/RxCocoa glitches after a data change in the Variable it's bound to 【发布时间】:2017-08-04 16:28:34 【问题描述】:当我单击以触发数据更改的单元格时,我的变量绑定到的 tableView 会跳转/出现故障。
tableView 和变量的绑定方式如下:
variable.asObservable()
.bind(to: tableView.rx.items)
(tableView, row, dataForRow) in
当按下 tableView 中的一个按钮时,我最终会像这样更新变量的值:
variable.value = updatedData
有人知道为什么会这样吗?
任何帮助将不胜感激。
提前致谢。
【问题讨论】:
【参考方案1】:每次观察到的数组发生变化时,标准 UITableView 绑定器都会调用reloadData
。 reloadData 调用不会设置动画,还会将表格视图重置为顶部。这可能就是您所看到的。您的选择是创建自己的 UITableViewDataSource 对象,该对象仅重新加载实际更改的单元格,或者使用 RxDataSources cocoapod 库为您执行此操作。
【讨论】:
感谢您的回复。 tableView 并没有一直重置到顶部,而且我还实现了没有 RxSwift 的相同功能,因此当数据更改时,我手动调用 reloadData() 并且没有发生跳转,所以我不认为调用reloadData() 是问题所在。使用 RxDataSources 解决问题可能是正确的,但该解决方案需要我有额外的依赖。我最终通过在调用 prepareForReuse() 时将新的 DisposeBag 实例分配给单元格的 diposeBag 变量来修复它。【参考方案2】:要解决此问题,您必须在调用 prepareForReuse() 时将新的 DisposeBag 实例分配给单元格的 disposeBag 变量:
class CustomCell: UITableViewCell
var disposeBag = DisposeBag()
override func prepareForReuse()
super.prepareForReuse()
disposeBag = DisposeBag()
【讨论】:
以上是关于使用 RxSwift/RxCocoa 制作的 TableView 在绑定到的变量中的数据更改后出现故障的主要内容,如果未能解决你的问题,请参考以下文章
处理 UITableView 绑定中的连接错误(Moya、RxSwift、RxCocoa)
Swft3 (RxSwift, RxCocoa) - TableView 使用响应式编程展开和折叠概念
关于 RxSwift/RxCocoa 与 combineLatest 绑定的问题