MVVM RxSwift从主视图发送数据到详细视图控制器的方式?

MVVM RxSwift从主视图发送数据到详细视图控制器的方式?

问题描述:

我有一个视图模型,它有一个元素在调用API之后返回一个可观察数组。MVVM RxSwift从主视图发送数据到详细视图控制器的方式?

然后我找到结果到表视图来显示它。我遇到的问题是如何调用被点击的特定单元格上的详细视图控制器。我将结果绑定到:

let queryResults = eventsViewModel.mainTableItems 

     queryResults 
      .bind(to: collectionView.rx.items) { collectionView, row, item in 

       let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: IndexPath(row: row, section: 0)) as! EventCell 
       cell.heroID = "heroCellID" 
       cell.restaurantNameLabel.text = item.name 
       cell.restaurantDetailLabel.text = item.location 
       cell.timeLabel.text = item.date 
       cell.restaurantImageView.kf.setImage(with: URL(string: item.image)) 

       return cell 
     } 
     .addDisposableTo(disposeBag) 

我无法访问此可观察数组中被点击的特定元素。它说一个Observable数组不能有下标。

这是说,代码:

vc.festival = queryResults.value[indexPath.row] 

我还是新的RxSwift,我努力理解这一点。

这真的是百万美元的问题,而且有很多不同的答案,甚至没有使用RxSwift都很简单。简而言之,这取决于您的应用程序的架构。

第一件事,如果您还没有意识到,是您找出哪个项目被选中与tableView.rx.itemSelected

恕我直言,视图控制器应该是彼此独立的,所以不要想做的一件事就是创建或继续从这一个详细视图控制器。应该有某种协调员对象订阅itemSelected并负责决定从那里去哪里。

这里有一些好文章,让你在正确的轨道上:

http://rasic.info/a-different-take-on-mvvm-with-swift/

在这篇文章中,RASIC先生谈到,他称该Scene它负责创建视图的类控制器及其视图模式,附加它们,然后决定从那里去哪里。

http://khanlou.com/2015/01/the-coordinator/

在这篇文章中,Khanlou先生谈到,他称该Coordinator类。他不使用Rx,而是使用代表,但很容易看出它如何关联。

https://talk.objc.io/episodes/S01E05-connecting-view-controllers

这就是objc.io团队创建了一个App类,它的视图控制器导航照顾的视频。他们在这里使用闭包而不是Rx,但通信应该是明显的。

+0

除了@ daniel-t,还有[ReactorKit](https:// github。com/ReactorKit/ReactorKit),它引入了“反应器”作为响应输入输出,以及一个[Clean architecture RxSwift示例应用程序](https://github.com/sergdort/CleanArchitectureRxSwift),它可以处理您可能想要的场景转换看着。 – ctietze

根据Daniel的建议,创建高级协调器对象可能是最佳选择,具体取决于应用的复杂程度。一个简单的选择是在eventsViewModel中创建一个属性,并从tableView.rx.itemSelected内为其分配一个值。然后,当你准备赛格瑞,你可以从eventsViewModel检索对象,像这样:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "identifier" { 
     let detailVC = segue.destination as! DetailViewController 
     if let selectedItem = eventsViewModel.item { 
      detailVC.viewModel = DetailViewModel(item: selectedItem) 
     } 
    } 
} 

可能不是最好的解决方案,但它的工作如预期。