使用 rxSwift 中的 tableView 单元将数据从视图模型传递到视图控制器

Posted

技术标签:

【中文标题】使用 rxSwift 中的 tableView 单元将数据从视图模型传递到视图控制器【英文标题】:Passing data from a view model to a view controller using tableView cell in rxSwift 【发布时间】:2021-10-01 05:03:29 【问题描述】:

所以我制作了一个简单的响应式表格视图来学习 rxSwift,但我在访问 ViewModel 中的数据时遇到了困难。所以我创建了一个我认为如何从我的视图模型中获取数据的非常糟糕的方法

        tableView.rx.itemSelected
            .subscribe(onNext: [weak self] indexPath in
                print("Tapped \(String(describing: self?.hospitalListVM?.result.value[0].id))")
            ).disposed(by: disposeBag)

我不认为这是处理数据的 rx 方式。有没有更好的解决方案来解决我在 viewModel 中访问数据的问题?

我的视图模型

class HospitalListViewModel:APIRequest 
    var baseURL:String = "https://"
    var method: RequestType = .GET
    var result = BehaviorRelay<[RumahSakitModel]>(value: [])
    var isLoaded = BehaviorRelay<Bool>(value: false)
    
    func fetchData() 
        guard let url = URL(string:baseURL) else  return 
        let session = URLSession.shared.dataTask(with: url)  data, _,_ in
            guard let data = data else  return 
            do 
                let hasil = try JSONDecoder().decode([RumahSakitModel].self, from: data)
                self.result.accept(hasil)
                self.isLoaded.accept(true)
             catch let err 
                print(err)
            
        
        session.resume()
      

我如何绑定我的 tablewView

        hospitalListVM?
            .result
            .bind(to: tableView.rx.items(cellIdentifier: HospitalTableCell.identifier, cellType: HospitalTableCell.self))  _, post, cell in
            cell.configureSubView(title: post.nama ?? " ", subTitle: post.jenis ?? " ")
            .disposed(by: disposeBag)

【问题讨论】:

你注册单元格并将tableview的delegate设置为self了吗? 能否提供输出截图? 它自己的输出是数据,比如1到n,但我认为这不合适 我没有将它注册到 tableview 委托,不知何故它与 rxCocoa 库冲突 @VisalRajapakse ,我可以得到输出,输出是数据的id。我想知道的是在这个问题上有没有其他合适的方法。 rx 快速方式 【参考方案1】:

找到所选对象的两种标准方法在这里:

let rumahSakitModel1 = tableView.rx.itemSelected
    .withLatestFrom(hospitalListVM!.result)  $1[$0.row] 

let rumahSakitModel2 = tableView.rx.modelSelected(RumahSakitModel.self)

使用上述任何一种方法,您都可以这样做:

rumahSakitModelX
    .subscribe(onNext:  model in
        print("Tapped \(model.id)")
    )
    .disposed(by: disposeBag)

【讨论】:

以上是关于使用 rxSwift 中的 tableView 单元将数据从视图模型传递到视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

使用 RxSwift 对成员“tableView”的模糊引用

tableView.rx.itemSelected 中的 RxSwift 双映射

如何在 RxSwift 中使用 tableView 数据源(numberOfRowsInSection)?

正确使用 RxSwift 和 TableView

如何使用 RxSwift 为空 tableView 显示 backgroundVIew

RxSwift 如何知道 TableView 重新加载结束