2017-06-03 10 views
2

私は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に新しいですし、私はこれを理解するために苦労しています:

これは、と言っているコードです。

答えて

1

これは実際には100万ドルの質問ですが、RxSwiftを使用しなくても、さまざまな回答が多く、まったく単純なものはありません。簡単な答えは、あなたのアプリがどのように構築されているかによって異なります。

最初に気づいたことがない場合、選択されたアイテムがtableView.rx.itemSelectedであることがわかります。

IMHO、ビューコントローラーは互いに独立している必要がありますので、は表示されません。は、このビューから詳細ビューコントローラーを作成またはセグにします。 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。リアクティブインサイドグルー、「Clean architecture RxSwiftサンプルアプリ」(https://github.com/sergdort/CleanArchitectureRxSwift)を紹介する「Reactors」を導入したシーン変遷を扱う「Com/ReactorKit/ReactorKit」見る。 – ctietze

0

アプリの複雑さによっては、ダニエルが示唆しているように、高水準のコーディネーターオブジェクトを作成することが最適な選択肢となる場合があります。 1つの簡単なオプションは、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) 
     } 
    } 
} 

ない最善の解決策が、意図したとおり、それは作業を行います。

関連する問題