RxSwift & RxDataSources 处理 UITableViewCell 内部UIButton点击

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)
 }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容