4

UIButton私が aに aを持っているとしましょうUITableViewCell。からセルをデキューした後、UITableViewにサブスクライブしたいUIButton.rx.tap。問題は、UITableViewCell複数回キューから取り出された場合、サブスクリプションが保持されることです。Disposable現在、私は my にプロパティを割り当てUITableViewCell、サブスクリプションの作成時に設定し、 を呼び出すことでDisposable.dispose()この問題を解決してUITableViewCell.prepareForReuse()いますが、呼び出しが必要な方法で機能を実装するDisposable.dispose()ことは、何か間違ったことをしていることを意味します。

再割り当てせずにサブスクリプションの一意性を達成するためのより良い方法はありますUIButtonか?

4

2 に答える 2

13

別の解決策 (追加のライブラリや呼び出しを必要としないDisposable.dispose()) は、このGitHub の問題で提案されているようDisposeBagに、セルに を入れて で再作成することです:prepareForReuse

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

セルにボタン (またはサブスクライブする他の Observables) がさらにある場合にも機能します。Disposableそれぞれのセル自体に新しいを作成する必要はありません。

于 2016-12-12T10:58:17.670 に答える
1

でリアクティブ サブスクリプションを使用すると、 Cell-Rxポッド形式を正しく使用できますUITableViewCell。を使用できるあなたのケースrx_reusableDisposeBagでは、サブスクリプションが正しく処分されます。

于 2016-12-09T13:10:15.087 に答える