订阅位于UITableViewDataSource中的UITableViewCell中的UIButton.rx.tap

时间:2016-12-09 12:13:12

标签: ios uibutton rx-swift reactivex rxdatasources

我们说UIButton中有一个UITableViewCell。 将UITableView中的单元格出列后,我想订阅UIButton.rx.tap。问题是如果我的UITableViewCell多次出列,订阅将保留。目前,我通过在Disposable中分配UITableViewCell属性,在创建订阅时设置该属性,并在Disposable.dispose()上调用UITableViewCell.prepareForReuse()来解决此问题,但据我所知以要求您调用Disposable.dispose()的方式实现功能意味着您做错了。

有没有更好的方法可以在不重新分配UIButton的情况下完成订阅的唯一性?

2 个答案:

答案 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,它会正确处理您的订阅。