Подписка на UIButton.rx.tap, расположенную в UITableViewCell в UITableViewDataSource.

Допустим, у меня есть UIButton в UITableViewCell. После удаления ячейки из очереди UITableView я хочу подписаться на UIButton.rx.tap. Проблема в том, что если мой UITableViewCell будет удален из очереди несколько раз, подписки сохранятся. В настоящее время я решаю эту проблему, выделяя свойство Disposable в своем UITableViewCell, устанавливая его при создании подписки и вызывая Disposable.dispose() для UITableViewCell.prepareForReuse(), однако, насколько я понимаю, реализация функций таким образом, который требует от вас вызова Disposable.dispose(), подразумевает, что вы делаете Что-то не так.

Есть ли лучший способ добиться уникальности подписки без перераспределения UIButton?


person Timofey Solonin    schedule 09.12.2016    source источник


Ответы (2)


Другое решение (которое не требует дополнительной библиотеки или вызова 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

Это также будет работать, если у вас есть больше кнопок (или других наблюдаемых, на которые вы хотите подписаться) в вашей ячейке. Вам не нужно будет создавать новый Disposable в самой ячейке для каждого из них.

person Michał Ciuba    schedule 12.12.2016
comment
Я пришел к выводу, что ваше решение на самом деле намного элегантнее. Что должно быть хорошо, так это разработать DisposeBase, который можно удалить без его повторного создания. - person Timofey Solonin; 31.10.2017
comment
Большое спасибо за это :) Спас меня от лишних библиотек и хаков. - person Saurabh Yadav; 11.02.2018

Вы можете использовать правильную форму модуля Cell-Rx, используя реактивные подписки в UITableViewCell. В вашем случае вы можете использовать rx_reusableDisposeBag, он правильно расставит ваши подписки.

person Artem Novichkov    schedule 09.12.2016
comment
Я забыл вызвать super.prepareForReuse() в своем UITableViewCell. Вот почему rx_reusableDisposeBag не перезагружается. Спасибо за предложение! - person Timofey Solonin; 11.12.2016