我们说UIButton
中有一个UITableViewCell
。
将UITableView
中的单元格出列后,我想订阅UIButton.rx.tap
。问题是如果我的UITableViewCell
多次出列,订阅将保留。目前,我通过在Disposable
中分配UITableViewCell
属性,在创建订阅时设置该属性,并在Disposable.dispose()
上调用UITableViewCell.prepareForReuse()
来解决此问题,但据我所知以要求您调用Disposable.dispose()
的方式实现功能意味着您做错了。
有没有更好的方法可以在不重新分配UIButton
的情况下完成订阅的唯一性?
答案 0 :(得分:11)
另一个解决方案(不需要额外的库或调用Disposable.dispose()
)是在单元格中有DisposeBag
并在prepareForReuse
中重新创建它,如建议的那样在此GitHub issue:
//in the cell
private(set) var disposeBag = DisposeBag()
override func prepareForReuse() {
super.prepareForReuse()
disposeBag = DisposeBag()
}
//in the data source
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! DiaryItemCell
cell.commentButton.rx_tap
.subscribeNext{
}.addDisposableTo(cell.disposeBag)
return cell
如果您的单元格中有更多按钮(或您想要订阅的其他Observable),它也会起作用。您不必为每个人在单元格中创建一个新的Disposable
。
答案 1 :(得分:1)
您可以使用UITableViewCell
中的被动订阅来正确使用Cell-Rx pod格式。对于您的情况,您可以使用rx_reusableDisposeBag
,它会正确处理您的订阅。