2017-10-24 2 views
0

Zuerst tut mir leid für den verwirrenden Titel, aber ich kann eigentlich nicht etwas besseres (wenn Sie tun, bitte bearbeiten).UITableViewCell mit UIButton in RxSwift world

Ich habe eine Anwendung mit Koordinator Muster und RxSwift, also alles in allem ich wan alle Navigation Verwandte Sachen zu Coordinator übergeben, so dass es Navigationslogik behandeln kann.
In einer Ansicht Controller habe ich UITableView mit Zellen, die UIButton in ihnen hat. Für diesen Fall habe ich ein:

actionButton.rx.tap.bind(to: viewModel.chapterAction).disposed(by: disposeBag) 

chapterAction ist ein PublishSubject<Void>, da es nur eine Taste tippen reflektiert, aber ich brauche, um mehr Informationen zu Coordinator passieren, so später verwandeln ich diese chapterAction zu:

var showChapter: Observable<Chapter> = self.chapterAction.mapTo(self.chapter) 

Und ich davon aus, dass bis zu diesem Punkt mit diesem Code falsch nichts da ist, so in .bind(to: tableView.rx.items... des View-Controller ich habe:

viewModel.showChapter.bind(to: self.viewModel.chapterAction).disposed(by: viewModel.disposeBag) 

Da ich dies binden wollen, um Controller viewModel und später subscribe im Koordinator anzuzeigen.
Es funktioniert alles ok, aber für einige Zellen bekomme ich doppelte Hähne, warum? Ich habe versucht, distinctUntil, shareReply setzen, aber nichts scheint mein Problem zu helfen, und es ist kein deterministisch. Ich einige Wiederverwendungs ​​vermuten, beteiligt zu sein, aber ich habe keine Ahnung, wo für dieses Problem zu suchen beginnen ...

Antwort

0

Sie müssen die disposeBag in prepareForReuse() Methode neu zu initialisieren:

override func prepareForReuse() { 
    super.prepareForReuse() 
    disposeBag = DisposeBag() 
} 

Dann Alle früheren Abonnements werden entsorgt.

+0

Dies ist nicht der Fall - ich mache diese Neuinitialisierung, aber immer noch dupliziert. Obwohl mein Codebeispiel angibt, dass ich die dispose-Tasche von viewModel verwende, habe ich tatsächlich jede Entsorgungs-Tasche ausprobiert, auf die ich von diesem Ort aus Zugriff hatte - die Ansichts-Controller der Zelle, des ViewModels – cojoj

0

Ich weiß immer noch nicht genau, was mit meinem Code falsch war, aber ich endete mit mapTo direkt in tableView.rx.items Binding Block. Jetzt sieht es wie folgt aus:

viewModel.chapterCellViewModels 
    .bind(to: tableView.rx.items(cellIdentifier: ChapterCell.nameOfClass, cellType: ChapterCell.self)) { (_, viewModel, cell) in 
     cell.configureCell(with: viewModel) 

     cell.actionButton.rx.tap 
      .mapTo(viewModel.chapter) 
      .bind(to: self.viewModel.chapterAction) 
      .disposed(by: cell.disposeBag) 
    } 
    .disposed(by: disposeBag) 

Wie ich in OP erwähnt habe - ich denke, es ist bis zu einem gewissen Wiederverwendung usw. zurückzuführen war, aber ich bin nicht in der Lage zu beantworten, warum dies geschah.

Verwandte Themen