2017-10-02 1 views
1

tableView.rx.itemSelectedからオブジェクトを取得したいと思っています。このメソッドはIndexPathを返すので、この値をマップできます。しかし、ViewModelからインデックスのオブジェクトを取得する方法は?tableView.rx.itemSelectedのRxSwift二重マッピング

struct ViewModel { 
    var items: Observable<[Item]> 
} 

おおよそ私はこのような何かを期待しています(ただし、この流れは間違っている):

tableView.rx.itemSelected 
     .map { indexPath -> Item in 
     return viewModel.items.map {$0[indexPath.row]} 
     } 
     ..subscribe(onNext: { [unowned self] item in 
     //other actions with Item object 
     }) 
     .disposed(by: disposeBag) 

私はどこかにこの可能性を示したが、それを思い出す傾けます。あなたはそれをどうやって考えていますか?

public var itemSelected: ControlEvent<IndexPath> { get }選択した項目のIndexPathを返し
とモデル要素を返し
public func modelSelected<T>(_ modelType: T.Type) -> ControlEvent<T>
あなたの例によると、それはなります:

tableView.rx.modelSelected(Item.self) 
     .subscribe(onNext: { [weak self] item in 
      // other actions with Item object 
     }).addDisposableTo(disposeBag) 
+0

'map'関数で' viewModel.items [indexPath.row] 'を返さないのはなぜですか? –

+0

@NikitaErmolenkoこの場合、エラーが発生します:タイプ 'Observable <[Item]>'には添え字メンバーがありません –

+0

どのようなタイプの 'viewModel.items'ですか? –

答えて

3

RxCocoaは、2つの方法がありますindexPathmodelの両方が必要な場合は、2つの方法とtransforを組み合わせることができます

Observable 
    .zip(tableView.rx.itemSelected, tableView.rx.modelSelected(String.self)) 
    .bind { [unowned self] indexPath, model in 
     self.tableView.deselectRow(at: indexPath, animated: true) 
     print("Selected " + model + " at \(indexPath)") 
    } 
    .disposed(by: disposeBag) 
+0

あなたのご意見ありがとうございます。あなたは2番目の流れについて正しいです。私はそれを使用したが、私は理解を深めたい。したがって、itemSelected処理が要求されます。 –