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

Subscription to a UIButton.rx.tap located in UITableViewCell within UITableViewDataSource

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

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

您可以在 UITableViewCell 中使用反应式订阅正确使用 Cell-Rx pod 形式。对于您的情况,您可以使用 rx_reusableDisposeBag,它将正确处理您的订阅。

另一个解决方案(不需要额外的库或调用 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