1: ViewController 部分
// 监听 Cell 内部的点击事件信号,并转发给 ViewModel
private typealias OprationingAction = (oprationRelay: PublishRelay<LbItemPresentable>, ())
private let oprationAction: OprationingAction = (oprationRelay: PublishRelay(), ())
// 用 Driver 的形式传递给 ViewModel
typealias Oprationting = (oprationBtn: Driver<LbItemPresentable>, ())
lazy var opration: Oprationting = (oprationBtn: oprationAction.oprationRelay.asDriver(onErrorDriveWith: .empty()), ())
private lazy var datasource = RxTableViewSectionedReloadDataSource<LbItemsSection>(configureCell: { _, tableView, indexPath, item in
let lbUserCell = tableView.dequeueReusableCell(withIdentifier: LeaderboardViewController.cellId, for: indexPath) as! LBUserCell
lbUserCell.configure(usingViewModel: item)
// 监听 按钮点击信号 并用 PublishRelay 转发给 ViewModel
lbUserCell.event.oprationBtn
.subscribe(onNext: { [weak self] (itemModel) in
self?.oprationAction.oprationRelay.accept(itemModel)
}).disposed(by: lbUserCell.bag) // 使用cell 内部的bag
return lbUserCell
})
2: ViewModel 部分
func startBinding() {
// ViewModel 中订阅 ViewConroller中的信号
self.input.oprationTap
.do(onNext: { (itemModel) in
print("\(itemModel.nikeName)")
})
.drive()
.disposed(by: bag)
}
2:UITableViewCell 部分
var viewModel: LbItemPresentable!
var bag = DisposeBag()
typealias CellBtnEvent = (oprationBtn: PublishRelay<LbItemPresentable>, ())
let event: CellBtnEvent = (oprationBtn: PublishRelay<LbItemPresentable>(), ())
override func prepareForReuse() {
super.prepareForReuse()
bag = DisposeBag()
}
func configure(usingViewModel viewModel: LbItemPresentable) {
self.viewModel = viewModel
self.oprationBtn.rx.tap
.subscribe(onNext: {[weak self] _ in
guard let `self` = self else { return }
// 按钮被点击 用 PublishRelay 发出信号
self.event.oprationBtn.accept(self.viewModel)
})
.disposed(by: self.bag)
}