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

时间:2017-06-03 20:18:09

标签: swift mvvm reactive-programming rx-swift reactive

我有一个视图模型,它有一个在调用API后返回一个可观察数组的元素。

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

 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的新手,我很难理解这一点。

2 个答案:

答案 0 :(得分:1)

这真的是百万美元的问题,而且即使没有使用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,但这种对应关系应该是显而易见的。

答案 1 :(得分:0)

根据应用程序的复杂程度,正如Daniel建议的那样 - 创建高级协调器对象可能是最佳选择。一个简单的选项是在PrintStream中创建一个属性,并在eventsViewModel内为其指定一个值。然后,当您准备segue时,您可以从tableView.rx.itemSelected检索对象,如下所示:

eventsViewModel

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