2016-12-09 16 views
1

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

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

ответ

7

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

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

+0

Я понял, что ваше решение на самом деле намного более элегантно. Что должно быть приятно, но это создание «DisposeBase», которое может быть утилизировано без повторного его восстановления. –

+0

Большое спасибо за это :) Сохраняли меня из дополнительных библиотек и хаков. –

1

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

+0

Я забыл вызвать super.prepareForReuse() в моем 'UITableViewCell'. Вот почему сброс 'rx_reusableDisposeBag' wan't. Спасибо за предложение! –

 Смежные вопросы

  • Нет связанных вопросов^_^