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

假设我在UITableViewCell有一个UIButton 。 从UITableView取出单元格后,我想订阅UIButton.rx.tap 。 问题是如果我的UITableViewCell多次出列,订阅将保留。 目前我通过在我的UITableViewCell分配一个Disposable属性,在创建订阅时设置它,并在UITableViewCell.prepareForReuse()上调用Disposable.dispose()来解决这个问题,但据我所知,以一种需要你的方式实现function调用Disposable.dispose()意味着你做错了什么。

有没有更好的方法来实现订阅的唯一性而无需重新分配UIButton

另一个解决方案(不需要额外的库或调用Disposable.dispose() )是在单元格中有一个DisposeBag并在prepareForReuse重新创建它,如此GitHub问题所示 :

 //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

您可以在UITableViewCell使用被动订阅来正确使用Cell-Rx pod格式。 对于您的情况,您可以使用rx_reusableDisposeBag ,它将正确处理您的订阅。